Compare commits

..

278 Commits

Author SHA1 Message Date
songyanguang 57ceab57e6 Function usb_mmap instead of naive_mmap 2024-11-05 10:34:24 +08:00
songyanguang 8ad7409aae Modify cpu mair setup 2024-10-25 15:33:06 +08:00
xj 2425a2a12e codes for MAIR supporting 2024-10-24 23:13:37 -07:00
songyanguang da16c4f01c Modify xhci debug log 2024-09-24 17:16:34 +08:00
songyanguang 7000c5cd18 According to ARMv8 architecture, the IRQ should be enable by calling gic_setup_spi when the NO. is larger than 31. 2024-09-20 19:28:42 +08:00
songyanguang 332bb5b870 Modify dwc3_dump 2024-09-14 15:29:05 +08:00
songyanguang 7c9d76b6af Add dwc3_dump 2024-09-14 10:22:19 +08:00
songyanguang 0027373c86 dwc3 init direction mode 2024-09-14 09:25:51 +08:00
songyanguang 7b5369a1f3 Modify DWC3 reg size to aligned to 4096 2024-09-13 15:31:22 +08:00
songyanguang b9c3e22f5f Modify DWC3 reg size 2024-09-13 15:05:40 +08:00
xj 014283451a DWC3 reg size 2024-09-12 23:57:59 -07:00
songyanguang d3c7f1d5c1 Add dwc3_phy_setup 2024-09-13 13:55:28 +08:00
xj a854fc28ba DWC3 event buffer functions 2024-09-12 19:59:39 -07:00
songyanguang ee3bcc6f66 Add dwc3_core_soft_reset 2024-09-13 10:23:25 +08:00
xj 7d575c4cea DWC3 event buffer functions 2024-09-12 05:21:10 -07:00
songyanguang 62c6017222 Tabs go space 2024-09-12 20:16:58 +08:00
songyanguang d41cdce316 Add dwc3_core_init 2024-09-12 20:10:15 +08:00
xj e6f6d3e1dd DWC3 scratch buffer functions 2024-09-12 04:45:05 -07:00
xj 5769e98844 DWC3 scratch buffer functions 2024-09-12 04:34:11 -07:00
songyanguang a509d162ec Add dwc3_init 2024-09-12 19:32:27 +08:00
xj 637408e192 Add DWC3 codes 2024-09-12 04:08:12 -07:00
songyanguang b51c911252 Modify dwc3_generic_probe 2024-09-12 18:50:59 +08:00
xj 43a771c15c Add DWC3 codes 2024-09-12 02:59:09 -07:00
xj 0e9625cf87 Add DWC3 codes 2024-09-12 02:38:41 -07:00
xj 506f37d009 Add DWC3 codes 2024-09-12 01:25:32 -07:00
songyanguang 6d834be991 Add dwc3 host probe 2024-09-11 19:11:45 +08:00
xj d2e410b69b Add DWC3 codes 2024-09-10 23:45:35 -07:00
xj 068e61694d Add DWC3 codes 2024-09-10 23:29:36 -07:00
xj 69288eb255 Add DWC3 codes 2024-09-10 23:01:44 -07:00
xj 0cd2ad6080 Add DWC3 codes 2024-09-10 20:26:24 -07:00
xj 43cf354e3d add DWC3 codes 2024-09-10 05:37:47 -07:00
xj 65fbdd5c1e add DWC3 codes 2024-09-09 23:53:03 -07:00
xj 636d643a4b add DWC3 codes 2024-09-09 23:52:40 -07:00
xj 2d3b8d0b95 Add dwc3 codes 2024-09-09 23:19:01 -07:00
xj f6ae7d7b13 Add dwc3 codes 2024-09-09 23:18:33 -07:00
xj 6229f7b1c8 add DWC3 codes 2024-09-09 04:58:55 -07:00
xj 33ac3e9048 add DWC3 codes 2024-09-09 03:02:06 -07:00
xj 36bd413225 add DWC3 codes 2024-09-09 01:34:15 -07:00
xj c3ab8a0b24 add DWC3 codes 2024-09-09 01:33:53 -07:00
xj c500ecfe10 Adding files for RK3568 USB 2024-09-08 20:01:27 -07:00
xj 6fd90067a0 Adding files for RK3568 USB 2024-09-08 20:00:37 -07:00
songyanguang 86e600ba5e Add xhci_dump_port_status_debug 2024-09-04 17:27:28 +08:00
songyanguang 636d4bf8c8 Add function handshake to wait for the HCHalted Status bit to be 0 2024-09-03 17:42:44 +08:00
songyanguang df1a8fac3a Add function xhci_dump 2024-09-03 17:20:16 +08:00
songyanguang 35b70a666c Debug: Replace the args of usb_osal_thread_create with global parameter 2024-09-03 16:57:49 +08:00
songyanguang abee37bf31 Not executing ipc_rndis_init to debug xhci 2024-09-03 16:34:01 +08:00
songyanguang c9838c2161 Modify usb_check_phymode 2024-09-03 16:26:48 +08:00
songyanguang ab8ba67a83 Fixed a bug in using usb_osal_mq_recv 2024-08-30 10:20:35 +08:00
songyanguang 137247d918 Obtain the interrupt number according to the usb id 2024-08-30 10:10:54 +08:00
songyanguang 08e1fba932 Modify the xHCI register size 2024-08-30 10:00:46 +08:00
xj e7a92d9417 Modify osal functions 2024-08-27 04:33:02 -07:00
songyanguang 24b1b5ac56 Add usb_check_phymode 2024-08-27 18:58:40 +08:00
xj eadaa44dd8 modify sleep function 2024-08-26 00:10:38 -07:00
xj 8c2eb4598f merge codes 2024-08-25 20:33:16 -07:00
xj 93ad360a1a merge codes 2024-08-25 20:10:52 -07:00
xj 21f454fd87 merge codes 2024-08-25 20:03:11 -07:00
songyanguang 083277e500 The paddr parameter needs to be 0 in the naive_mmap function. 2024-08-21 17:22:54 +08:00
songyanguang 2f03186b0b Fix a register issue. 2024-08-21 11:24:06 +08:00
songyanguang bdfdc65bf6 usb memory virtual address reference XiZi, and modify naive_mmap usage method. 2024-08-21 10:45:34 +08:00
songyanguang 883cd6e4d5 Modify usb log level to Debug 2024-08-21 09:23:26 +08:00
songyanguang aa7c708a4b Set usb hc type USB_HC_XHCI in usb init 2024-08-21 09:16:54 +08:00
songyanguang 3f80e39695 rndis waits for LWIPServer in thread. 2024-08-20 10:11:27 +08:00
songyanguang 72ceb7fd26 Compile usb_driver_service into fs.img. 2024-08-20 09:35:11 +08:00
songyanguang 5168e88911 Generate the usb_driver_service program. 2024-08-19 19:45:22 +08:00
songyanguang 398c2590c7 Fix compilation issues 2024-08-19 19:30:52 +08:00
songyanguang 721763bb00 usb class info is created when initialized. 2024-08-19 19:17:50 +08:00
xj 7a7318734b adding usb_assert 2024-08-16 05:32:32 -07:00
songyanguang dd3104c4a1 Modify the usb main function. 2024-08-16 18:05:19 +08:00
xj 27247f7d00 sleep function 2024-08-15 19:38:29 -07:00
songyanguang d3fb123c29 usb code is adapted to rk3568. 2024-08-15 19:55:16 +08:00
songyanguang a9273b9879 Merge branch rk3568_dev of https://www.gitlink.org.cn/tuyuyang/xiuos with commit 6bc856b7a6 into local 2024-08-15 19:26:02 +08:00
songyanguang 059da067df New IPC interface, lwip receives data from rndis. 2024-08-14 17:22:54 +08:00
xj b53ba2e4b4 Interrupt function 2024-08-13 19:31:36 -07:00
songyanguang aaceb82386 New IPC interface, lwip sends data to rndis 2024-08-13 14:43:22 +08:00
songyanguang 84ab3dff35 Modify rndis and lwip interaction function name. 2024-08-13 09:59:31 +08:00
xj 7003f26807 Add interrupt processing functions 2024-08-09 04:54:40 -07:00
xj 91d06a23b3 Add interrupt processing functions 2024-08-09 01:07:10 -07:00
xj 0816b5427a Add interrupt processing functions 2024-08-09 00:51:02 -07:00
xj 45a36e5776 Add interrupt processing functions 2024-08-08 20:20:28 -07:00
xj 4170e41ab7 Add interrupt processing functions 2024-08-08 20:03:37 -07:00
xj cd35c4e733 Adding interrupt codes 2024-08-08 00:18:38 -07:00
xj 0e09b55903 Adding interrupt codes 2024-08-08 00:08:23 -07:00
xj b9de9baf1c Adding interrupt codes 2024-08-07 23:43:11 -07:00
xj 55eef9ff58 Add comments 2024-08-07 19:21:28 -07:00
songyanguang c637a3d0bc Modify xhci code to adapt to XIZI. 2024-08-07 18:57:40 +08:00
xj 22b137f92f Modify address mapping in xhci_transfer 2024-08-06 23:33:57 -07:00
songyanguang 98a64f616d xhci ring memory is fetched from the memory resource pool. 2024-08-07 09:32:21 +08:00
xj f8768d29a2 add usb3.0 interrupt NO 2024-08-05 23:54:52 -07:00
songyanguang 5e829d5da0 Modify Transfer TRB code in xHCI to apply to XiZi AIOT. 2024-08-06 14:44:05 +08:00
xj b383f88d7d modify function name 2024-08-05 20:20:39 -07:00
xj c689c550d7 modify function name 2024-08-05 19:51:38 -07:00
xj 951c3bf203 modify function name 2024-08-05 19:42:04 -07:00
xj 7d6cc6d1d8 modify variate name 2024-08-05 19:24:52 -07:00
songyanguang 3886ed4b12 fix a bug 2024-08-05 20:54:24 +08:00
songyanguang 77bed3c28f Modify USB Device Initialization in xHCI code and Command TRB code to apply to XiZi AIOT. 2024-08-05 20:47:51 +08:00
xj 2eba5a8071 Replanting xhci_port_status 2024-08-05 02:20:41 -07:00
xj ad027ba080 Replanting xhci_complete 2024-08-05 01:47:35 -07:00
xj 48ff62be23 Replanting xhci_complete 2024-08-05 01:38:11 -07:00
xj acf338844a Replanting xhci_transfer 2024-08-05 01:16:19 -07:00
xj bf9c5056ac Adding usb memory pool functions 2024-08-05 00:51:52 -07:00
xj 3928cd46b7 Replanting xhci_event_process function 2024-08-01 20:09:00 -07:00
xj 6ab2083403 Add USB memory pool functions 2024-08-01 01:40:18 -07:00
xj 19269781b4 Add USB memory pool function 2024-08-01 00:27:38 -07:00
xj 1bc171a131 Implanting xhci_run and some free functions 2024-07-29 04:51:48 -07:00
xj f322fce778 Implanting xhci_run and some free functions 2024-07-29 04:49:30 -07:00
xj bed67b388f Implanting event ring initialization 2024-07-29 02:03:42 -07:00
songyanguang 181362892a Modify IPC-related functions in rndis host 2024-07-24 15:44:24 +08:00
songyanguang 1d7bcb479d Modify MessageLength in usbh_rndis_eth_tx 2024-07-23 18:17:59 +08:00
songyanguang 46d67a2115 rndis bulk transfer buffer uses physical addresses 2024-07-23 14:56:38 +08:00
songyanguang f81170c61d Modify rndis_host.c according to CherryUSB v0.10.2 2024-07-23 09:24:27 +08:00
xj 098d39181d Command RING Initialize 2024-07-16 06:10:40 -07:00
songyanguang 6504f11f00 rndis uses naive_mmap to allocate memory during connect. 2024-07-16 18:25:50 +08:00
songyanguang f1f533cdc1 usbh_core hub and rndis use naive_mmap to assign virtual and physical addresses, and match the relevant codes. 2024-07-16 09:42:16 +08:00
xj a91baab639 for xhci command ring 2024-07-12 04:21:57 -07:00
songyanguang 4cceb8cd3b rndis ADAPTS to usb core to decouple xhci. 2024-07-10 09:44:08 +08:00
songyanguang 2da33e48dc Added file modification description. 2024-07-10 09:42:59 +08:00
songyanguang 459a7ad7cf Modify usbh_rndis related files according to CherryUSB v0.1.2 2024-07-09 16:40:13 +08:00
songyanguang b623803db4 Add compiling rndis. 2024-07-09 16:34:10 +08:00
xj 7cb39f992c Implant scratchpad buffer functions 2024-07-05 06:05:54 -07:00
xj ab573e238e Implant scratchpad buffer functions 2024-07-05 01:11:33 -07:00
xj d2164713b3 Add fls function 2024-07-04 05:25:53 -07:00
xj 4a657a3044 replace DSB 2024-07-04 02:53:40 -07:00
songyanguang c5db36f4b9 enable DSB 2024-07-04 11:28:28 +08:00
xj 114ff07759 replace header file which is referred in usb_log.h 2024-07-03 18:46:26 -07:00
xj 0c5851f05b modify lwip_service.c for test 2024-07-03 06:31:55 -07:00
xj f1bbde5216 fix bugs 2024-07-03 06:30:28 -07:00
xj ad5acb644b fix bugs 2024-07-03 06:15:24 -07:00
xj 57ae614071 update dcbaa functions in xhci.c, and Makefile in xhci 2024-07-03 04:58:05 -07:00
xj aedc9d86fc update dcbaa functions 2024-07-03 01:19:52 -07:00
xj 12e5b67108 update kernel codes 2024-07-02 19:48:07 -07:00
xj b2c3a24f35 Modify xhci_port_protocol, xhci_supported_protocol and xhci_legacy_release so that the xHCI can adapt to XiZi AIOT 2024-07-01 05:18:53 -07:00
xj ac3527bbc2 Modify xhci_port_protocol, xhci_supported_protocol and xhci_legacy_release so that the xHCI can adapt to XiZi AIOT 2024-07-01 05:03:28 -07:00
xj e30c4e662f Modify xhci_port_protocol, xhci_supported_protocol and xhci_legacy_release so that the xHCI can adapt to XiZi AIOT 2024-07-01 05:01:14 -07:00
xj 21a0f8ed30 Modify xhci_reset so that the xHCI can adapt to XiZi AIOT 2024-07-01 04:13:01 -07:00
xj 3efb2335c5 Modify xhci_stop so that the xHCI can adapt to XiZi AIOT 2024-07-01 03:02:01 -07:00
xj e34d688cc3 Modify xhci_legacy_init so that the xHCI can adapt to XiZi AIOT 2024-07-01 01:37:23 -07:00
xj eac58cedec Modify xhci_extended_capability so that the xHCI can adapt to XiZi AIOT 2024-07-01 00:12:14 -07:00
xj 7c48797ecf Adding more USB hardware information for RK3568 2024-06-28 04:37:15 -07:00
xj 9ce7259447 Adding more USB hardware information for RK3568 2024-06-28 04:32:00 -07:00
xj 41a4e81d7d Adding more USB hardware information for RK3568 2024-06-28 04:12:02 -07:00
songyanguang 7ed436a8c8 Add TODO comments to the function to be modified. 2024-06-28 18:00:28 +08:00
xj 098c8a9879 Merge branch '5g_usb' of https://gitlink.org.cn/kameblue/xiuos into 5g_usb 2024-06-28 00:26:04 -07:00
xj 3beb9fb2b9 Adding more USB hardware information for RK3568 2024-06-28 00:15:10 -07:00
songyanguang d2c1180cce Modify usb core to call functions defined by xhci. 2024-06-28 15:00:21 +08:00
xj 805cd766ea Adding more USB hardware information for RK3568 2024-06-27 23:45:07 -07:00
xj bf1947052b Adding more USB hardware information for RK3568 2024-06-27 23:06:22 -07:00
xj b0471990a3 Adding more USB hardware information for RK3568 2024-06-27 20:28:57 -07:00
xj 2c82079be7 Adding more USB hardware information for RK3568 2024-06-27 20:10:44 -07:00
xj e44ae64451 Add address of USB3.0 host controller registers in RK3568 2024-06-25 23:39:18 -07:00
xj 9bf663c476 Add address of USB3.0 host controller registers in RK3568 2024-06-25 22:58:36 -07:00
xj e9b9e907c6 Add physical page interface 2024-06-25 19:38:58 -07:00
songyanguang 47a330b08f Modify the hub to decouple from xhci. 2024-06-24 15:42:00 +08:00
songyanguang 513b74b845 Modify usbh_hub.c according to freertos source code. 2024-06-24 15:31:57 +08:00
songyanguang aa68affc46 rewrite xhci function usbh_get_port_speed 2024-06-24 15:08:02 +08:00
songyanguang dd55f8d731 Modifying functions in usb core is related to xhci. 2024-06-24 14:52:48 +08:00
songyanguang 56b8a29888 Modifying functions in usb core is related to xhci. 2024-06-24 14:15:33 +08:00
songyanguang 39620c574e Modifying functions in usb core is related to xhci. 2024-06-24 14:10:54 +08:00
songyanguang 7f188bff03 Modify USB core code to decouple from xhci. 2024-06-20 17:44:51 +08:00
xj 545c240c8d Modify xhci functions for USB core 2024-06-18 23:34:39 -07:00
xj 5d240f93ae Modify xhci functions for USB core 2024-06-18 23:30:51 -07:00
xj a66824c9ad Modify xhci functions for USB core 2024-06-18 23:23:47 -07:00
xj eef25d3004 Modify xhci functions for USB core 2024-06-18 23:21:44 -07:00
xj 83a4b774b5 Modify xhci functions for USB core 2024-06-18 23:10:46 -07:00
songyanguang 9f3edeb6b4 Extract the functions of the host controller to USB core. 2024-06-19 10:35:39 +08:00
songyanguang cc22f1b8f8 New field usb_hc_type in data structure usbh_urb 2024-06-19 10:33:20 +08:00
xj 3d5e8ed6fc uncouple the USB core and xhci 2024-06-18 18:32:11 -07:00
xj eee6a74ff0 Adding folders for future USB IP 2024-06-18 05:27:09 -07:00
xj 01a0f62f78 Adding folders for future USB IP 2024-06-18 05:20:32 -07:00
xj 75e1299ac7 Establish Folders for future USB IP 2024-06-18 05:04:38 -07:00
songyanguang d4f72f2ad9 Decoupling core and xhci. 2024-06-18 16:09:32 +08:00
xj 303737e590 Copy xhci functions first. We should redevelop xhci functions step by step 2024-06-17 19:01:59 -07:00
xj 01a92a269c Implant xhci codes 2024-06-17 02:56:24 -07:00
songyanguang 0a1df937ad Modify usbh_core.c for references file 2024-06-17 15:35:15 +08:00
xj 04a0e2a0f6 Re-design xhci functions to dock with USB core 2024-06-16 23:39:02 -07:00
xj 97e0d1aa67 Develop OS abstract layer functions 2024-06-16 20:12:18 -07:00
xj 7472a6de3d Modify OS Abstract layer 2024-06-15 20:52:26 -07:00
xj b3fdaef640 Replanting OSAL codes 2024-06-13 03:00:24 -07:00
xj 3acfca1e34 Add comments 2024-06-13 00:08:58 -07:00
xj a3795dd0f7 Delete a source file 2024-06-12 18:39:47 -07:00
xj 7635db0f84 Editing OS abstract layer codes for USB 2024-06-12 01:50:27 -07:00
xj 6039856cd2 Modify source files 2024-06-11 22:58:17 -07:00
xj 9469217fe6 Modify header files 2024-06-11 03:09:06 -07:00
xj 24262508c4 Modify header files 2024-06-11 02:20:00 -07:00
xj 06b969a119 Modify header files 2024-06-11 01:53:19 -07:00
xj 403d1daab1 Implant USB memory functions 2024-06-11 01:48:10 -07:00
xj 7d78fc6c2a Modify source files 2024-06-11 00:27:04 -07:00
xj 02990bfd1e Modify source files 2024-06-11 00:26:36 -07:00
xj b17ce138fa Modify code tree 2024-06-10 23:24:32 -07:00
xj 28d0cc056c Adjust code tree 2024-06-10 23:08:28 -07:00
xj 7968c89e5d Modify header files 2024-06-10 23:06:41 -07:00
xj cb397c2c9e transplant header files 2024-06-07 03:06:11 -07:00
xj 8e1bd559d5 Modify Makefile 2024-06-07 00:56:57 -07:00
xj 02e0623175 Modify files 2024-06-07 00:54:57 -07:00
xj 236f8bdb31 Modify files 2024-06-07 00:54:42 -07:00
xj e61dee8922 Modify Makefile 2024-06-06 20:15:48 -07:00
xj 64477bafda Modify code tree 2024-06-06 19:09:16 -07:00
xj cbdabf3adc Ajust code tree 2024-06-06 19:06:37 -07:00
xj 09e7094ec3 Modify Makefiles 2024-06-06 02:12:13 -07:00
xj d1b462b83f Modify Makefiles 2024-06-06 00:44:56 -07:00
xj 29c2f1e3a8 Modify Makefiles 2024-06-06 00:44:29 -07:00
lr 336a640698 add eth_hal at app/MakeFile 2024-06-06 15:23:47 +08:00
lr 3222b892e8 add eth_hal 2024-06-06 15:17:27 +08:00
xj 3df2629a18 Delete rk3568 dir 2024-06-05 23:56:24 -07:00
xj a4681f5f8f Modify Makefiles 2024-06-05 23:54:36 -07:00
xj 8ab512df2d Add Makefiles 2024-06-05 23:26:45 -07:00
xj 1017bf724c Modify Makefiles 2024-06-05 23:16:06 -07:00
xj 31c23b7ad0 Modify Makefiles 2024-06-05 23:15:52 -07:00
xj 1fc7e9ff6c Modify files 2024-06-05 22:59:30 -07:00
xj 7f6cc40594 Adjust Files 2024-06-05 19:44:00 -07:00
xj d4fde5c2fb Modify Makefiles 2024-06-05 03:21:09 -07:00
xj 3746135317 Modify Makefiles 2024-06-05 01:48:27 -07:00
xj 3fc089d277 Modify Makefiles 2024-06-05 01:03:24 -07:00
xj c2448b85b3 Modify Makefiles 2024-06-05 00:52:46 -07:00
xj 600079be0f Modify Makefiles 2024-06-05 00:45:05 -07:00
xj 47bd0b9734 Accept merge 2024-06-04 23:53:32 -07:00
xj bb437f86cf Merge branch '5g_usb' of https://gitlink.org.cn/kameblue/xiuos into 5g_usb 2024-06-04 23:51:51 -07:00
xj beba1dc16e Modify Makefiles 2024-06-04 23:46:09 -07:00
lr 8d1870240b Merge branch '5g_usb' of https://gitlink.org.cn/kameblue/xiuos into 5g_usb 2024-06-05 14:42:01 +08:00
lr 37603ac9c3 fix armv8 complie support at drk3568 ethernet 2024-06-05 14:39:55 +08:00
lr 84e066d209 del rk3568 drivers hal lib(todo: replace with uboot ETH Driver) 2024-06-05 14:25:04 +08:00
lr dca029936f add armv8 compile suppout to lwip 2024-06-05 14:20:16 +08:00
xj 6fd3d385d6 Modify Makefiles 2024-06-04 23:03:28 -07:00
xj a293563990 Add Makefiles 2024-06-04 03:12:08 -07:00
xj 5a7a7b36f9 Add Makefiles 2024-06-04 03:01:52 -07:00
lr 525e02c275 FIx rk3568 hal-lib,todo: map phy addr to virt addr 2024-06-04 17:49:55 +08:00
xj 7881e6700f Add Makefiles 2024-06-04 02:04:15 -07:00
xj c65fb1fe79 Add Makefiles 2024-06-04 02:03:37 -07:00
xj f02fa3512f Ajust code tree 2024-06-04 00:49:57 -07:00
xj ac58c0bde1 Adjust code tree 2024-06-03 23:48:22 -07:00
xj 82a363e81b Ajust code tree 2024-06-03 22:59:02 -07:00
xj 6dca0f5bd7 Add USB source tree 2024-06-03 02:42:23 -07:00
lr 6fd44a89ed rename hal_gmac 2024-06-03 17:38:40 +08:00
lr 5ed3ba4240 Merge branch '5g_usb' of https://gitlink.org.cn/kameblue/xiuos into 5g_usb 2024-06-03 17:22:54 +08:00
xj ea8b1f5374 Add USB source tree 2024-06-03 01:55:57 -07:00
xj d2dd347ed5 Add USB source tree 2024-06-03 01:48:32 -07:00
lr 4f182f90c9 add hal ethernet driver 2024-06-03 16:45:09 +08:00
xj c5263acba5 Add USB source tree 2024-06-03 01:31:46 -07:00
xj b9cd006f8f Add USB source tree 2024-06-03 01:19:34 -07:00
xj 730d3be87b Add USB source tree 2024-06-03 01:12:51 -07:00
xj 01e8e80c0e Add USB source tree 2024-06-03 00:47:04 -07:00
xj c8bc2ddd05 Add USB configure file 2024-06-02 23:42:52 -07:00
xj 0b43c65650 Add USB folders 2024-06-02 23:16:08 -07:00
lr 5d6cd493bf Merge branch 'smp' of https://gitlink.org.cn/tuyuyang/xiuos into lwip 2024-05-31 09:40:35 +08:00
lr 67f6b4641c fix sys_arch.c 2024-05-29 18:34:37 +08:00
lr 2f4a29860c Merge branch 'smp' of https://gitlink.org.cn/tuyuyang/xiuos into lwip 2024-05-29 16:53:35 +08:00
lr 60b1906396 fix sys_arch to adapt kernel semaphore 2024-05-29 16:44:19 +08:00
lr a9309fa1b4 Merge branch 'smp' of https://gitlink.org.cn/tuyuyang/xiuos into lwip 2024-05-29 15:37:20 +08:00
lr 6add0df96b fix lwipopts.h 2024-05-29 15:33:12 +08:00
lr a0c6addb14 fix sys_sem_* and sys_mbox_* function 2024-05-23 16:55:36 +08:00
lr 8c0b51161e Revert "add debug message"
This reverts commit 99967e9f9b.
2024-05-23 15:54:34 +08:00
lr 99967e9f9b add debug message 2024-05-23 15:50:37 +08:00
lr 2147d92121 complie and debug test_net 2024-05-23 11:26:36 +08:00
lr dced598cbf test lwip through udp 2024-05-22 20:38:09 +08:00
lr 43bb298df9 warp the socket api 2024-05-22 18:05:50 +08:00
lr 1a4be4e6b4 enable lwip socket api 2024-05-21 15:51:28 +08:00
lr f1d39b2e25 lwip server with !NO_SYS init 2024-05-21 15:30:11 +08:00
lr 6252e7e383 fix lwip !no_sys to complied success 2024-05-20 15:43:45 +08:00
lr 3e4c6e35e3 add sys_arch.c in makefile in net_server 2024-05-20 15:33:05 +08:00
lr d63d9dfae4 disable lwip_socket 2024-05-20 15:30:35 +08:00
lr 3178ece116 Merge branch 'smp' of https://gitlink.org.cn/tuyuyang/xiuos into lwip 2024-05-20 14:32:22 +08:00
lr fa710bbc37 modify lwip to !no_sys 2024-05-20 10:19:39 +08:00
lr 4e67992516 Merge branch 'smp' of https://gitlink.org.cn/tuyuyang/xiuos into lwip 2024-05-20 09:27:24 +08:00
lr bcc5251dc0 add test_net.c 2024-05-17 18:07:26 +08:00
lr 59c1edce98 add test_net.c and modify makefile 2024-05-17 16:10:04 +08:00
lr 514b9973b6 modify makefile eventually again 2024-05-17 15:23:08 +08:00
lr 18537fc922 modify makefile eventually 2024-05-17 09:56:21 +08:00
lr aabb860bb2 modify makefile 2024-05-16 21:53:56 +08:00
lr 0acf8c26be modify makefile 2024-05-16 21:03:01 +08:00
lr b2022bac12 modify lwip/arch.h 2024-05-16 16:03:36 +08:00
lr 3cec54bf5f modify makefile 2024-05-16 15:48:48 +08:00
lr f81a16a041 modify fs nr_bit_block 2024-05-16 14:55:16 +08:00
lr a66d833cea Merge branch 'smp' of https://gitlink.org.cn/tuyuyang/xiuos into lwip 2024-05-16 14:47:23 +08:00
lr 642023dd0c delete arch 2024-05-16 14:45:57 +08:00
lr 63c67f7185 modify arch 2024-05-16 14:27:44 +08:00
lr bbfc42fbab modify makefile 2024-05-16 11:19:34 +08:00
lr 7aa0cde8f2 modify mkfs.h 2024-05-15 18:34:57 +08:00
lr 40726602ec Merge branch 'smp' into lwip 2024-05-15 18:02:27 +08:00
lr 526834acda init net 2024-05-15 17:54:07 +08:00
592 changed files with 182210 additions and 5313 deletions

View File

@ -1,3 +1,3 @@
SRC_DIR := advantech beckhoff br delta mitsubishi omron schneider siemens ge xinje inovance keyence panasonic fatek ab abb koyo SRC_DIR := advantech beckhoff br delta mitsubishi omron schneider siemens ge xinje inovance keyence panasonic fatek ab abb
include $(KERNEL_ROOT)/compiler.mk include $(KERNEL_ROOT)/compiler.mk

View File

@ -1,3 +1,3 @@
SRC_FILES := inovance_am401_cpu1608tn_ethernet.c inovance_am401_cpu1608tn_uart.c inovance_H3U_cpu3232MT_ethernet.c SRC_FILES := inovance_am401_cpu1608tn_ethernet.c inovance_am401_cpu1608tn_uart.c
include $(KERNEL_ROOT)/compiler.mk include $(KERNEL_ROOT)/compiler.mk

View File

@ -1,52 +0,0 @@
/*
* Copyright (c) 2024 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
/**
* @file inovance_H3U_cpu3232MT_ethernet.c
* @brief PLC Inovance H3U-3232MT app
* @version 3.0
* @author AIIT XUOS Lab
* @date 2024.08.06
*/
#include <control.h>
void ControlInovanceH3UCPU3232MTTest(void)
{
int i, j = 0;
int read_data_length = 0;
uint8_t read_data[128] = {0};
ControlProtocolType modbus_tcp_protocol = ControlProtocolFind();
if (NULL == modbus_tcp_protocol) {
printf("%s get modbus tcp protocol %p failed\n", __func__, modbus_tcp_protocol);
return;
}
printf("%s get modbus tcp protocol %p successfull\n", __func__, modbus_tcp_protocol);
if (CONTROL_REGISTERED == modbus_tcp_protocol->protocol_status) {
ControlProtocolOpen(modbus_tcp_protocol);
for (;;) {
read_data_length = ControlProtocolRead(modbus_tcp_protocol, read_data, sizeof(read_data));
printf("%s read [%d] modbus tcp data %d using receipe file\n", __func__, i, read_data_length);
if (read_data_length) {
for (j = 0; j < read_data_length; j++) {
printf("j %d data 0x%x\n", j, read_data[j]);
}
}
i++;
memset(read_data, 0, sizeof(read_data));
PrivTaskDelay(10000);
}
// ControlProtocolClose(modbus_tcp_protocol);
}
}
PRIV_SHELL_CMD_FUNCTION(ControlInovanceH3UCPU3232MTTest, Inovance PLC N3UCPU3232MT Demo, PRIV_SHELL_CMD_MAIN_ATTR);

View File

@ -1,30 +0,0 @@
{
"device_id": 1,
"device_name": "Ino_H3U3232MT",
"communication_type": 0,
"socket_config": {
"plc_ip": "192.168.250.55",
"local_ip": "192.168.250.147",
"gateway": "192.168.250.252",
"netmask": "255.255.255.0",
"port": 502
},
"protocol_type": 2,
"read_period": 300,
"read_item_list": [
{
"value_name": "M8000",
"value_type": 1,
"function_code": 1,
"start_address": 8000,
"quantity": 1
},
{
"value_name": "D120",
"value_type": 3,
"function_code": 3,
"start_address": 120,
"quantity": 1
}
]
}

View File

@ -1,52 +0,0 @@
/*
* Copyright (c) 2024 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
/**
* @file koyo_nk1cpu40.c
* @brief PLC AB MICRO850 app
* @version 3.0
* @author AIIT XUOS Lab
* @date 2024.07.03
*/
#include <control.h>
void ControlKoyoNK1CPU40Test(void)
{
int i, j = 0;
int read_data_length = 0;
uint8_t read_data[128] = {0};
ControlProtocolType modbus_tcp_protocol = ControlProtocolFind();
if (NULL == modbus_tcp_protocol) {
printf("%s get modbus tcp protocol %p failed\n", __func__, modbus_tcp_protocol);
return;
}
printf("%s get modbus tcp protocol %p successfull\n", __func__, modbus_tcp_protocol);
if (CONTROL_REGISTERED == modbus_tcp_protocol->protocol_status) {
ControlProtocolOpen(modbus_tcp_protocol);
for (;;) {
read_data_length = ControlProtocolRead(modbus_tcp_protocol, read_data, sizeof(read_data));
printf("%s read [%d] modbus tcp data %d using receipe file\n", __func__, i, read_data_length);
if (read_data_length) {
for (j = 0; j < read_data_length; j++) {
printf("j %d data 0x%x\n", j, read_data[j]);
}
}
i++;
memset(read_data, 0, sizeof(read_data));
PrivTaskDelay(10000);
}
// ControlProtocolClose(modbus_tcp_protocol);
}
}
PRIV_SHELL_CMD_FUNCTION(ControlKoyoNK1CPU40Test, Koyo Plc NK1CPU40 Demo, PRIV_SHELL_CMD_MAIN_ATTR);

View File

@ -977,7 +977,7 @@ int AdapterLoraTest(void)
char task_name_2[] = "adapter_lora_gateway"; char task_name_2[] = "adapter_lora_gateway";
args.pthread_name = task_name_2; args.pthread_name = task_name_2;
args.arg = (void *)adapter; args.arg = (void *)adapter;
PrivTaskCreate(&lora_gateway_task, &lora_gateway_attr, &LoraGatewayTask, (void *)&args); PrivTaskCreate(&lora_recv_data_task, &lora_gateway_attr, &LoraReceiveTask, (void *)&args);
#endif #endif
PrivTaskStartup(&lora_gateway_task); PrivTaskStartup(&lora_gateway_task);

View File

@ -4,7 +4,7 @@ MAKEFLAGS += --no-print-directory
.PHONY:COMPILE_APP COMPILE_KERNEL .PHONY:COMPILE_APP COMPILE_KERNEL
riscv_support := riscv_support :=
arm_support += imx6q-sabrelite zynq7000-zc702 ok1028a-c arm_support += imx6q-sabrelite zynq7000-zc702 3568
emulator_support += emulator_support +=
support := $(riscv_support) $(arm_support) $(emulator_support) support := $(riscv_support) $(arm_support) $(emulator_support)
SRC_DIR := SRC_DIR :=
@ -34,8 +34,8 @@ export UBIQUITOUS_ROOT ?= ..
ifneq ($(findstring $(BOARD), imx6q-sabrelite zynq7000-zc702), ) ifneq ($(findstring $(BOARD), imx6q-sabrelite zynq7000-zc702), )
include $(KERNEL_ROOT)/hardkernel/arch/arm/armv7-a/cortex-a9/preboot_for_$(BOARD)/config.mk include $(KERNEL_ROOT)/hardkernel/arch/arm/armv7-a/cortex-a9/preboot_for_$(BOARD)/config.mk
endif endif
ifneq ($(findstring $(BOARD), ok1028a-c), ) ifneq ($(findstring $(BOARD), 3568), )
include $(KERNEL_ROOT)/hardkernel/arch/arm/armv8-a/cortex-a72/preboot_for_$(BOARD)/config.mk include $(KERNEL_ROOT)/hardkernel/arch/arm/armv8-a/cortex-a55/preboot_for_$(BOARD)/config.mk
endif endif
export BSP_BUILD_DIR := $(KERNEL_ROOT) export BSP_BUILD_DIR := $(KERNEL_ROOT)
export HOSTTOOLS_DIR ?= $(KERNEL_ROOT)/services/tools/hosttools export HOSTTOOLS_DIR ?= $(KERNEL_ROOT)/services/tools/hosttools
@ -133,6 +133,8 @@ clean:
@rm -rf services/tools/mkfs/mkfs @rm -rf services/tools/mkfs/mkfs
@rm -rf services/app/fs.img @rm -rf services/app/fs.img
@rm -rf services/app/user.map @rm -rf services/app/user.map
@rm -rf services/net/net_server/user.map
@rm -rf services/net/net_server/bin
distclean: distclean:
@echo Clean all configuration @echo Clean all configuration

View File

@ -1,5 +1,5 @@
# The following three platforms support compatiable instructions. # The following three platforms support compatiable instructions.
ifneq ($(findstring $(BOARD), ok1028a-c), ) ifneq ($(findstring $(BOARD), 3568), )
SRC_DIR := armv8-a SRC_DIR := armv8-a
endif endif
ifneq ($(findstring $(BOARD), imx6q-sabrelite zynq7000-zc702), ) ifneq ($(findstring $(BOARD), imx6q-sabrelite zynq7000-zc702), )

View File

@ -74,7 +74,7 @@ Modification:
#include "cortex_a9.h" #include "cortex_a9.h"
#define NR_CPU 4 #define NR_CPU 1
__attribute__((always_inline, optimize("O0"))) static inline uint32_t user_mode() __attribute__((always_inline, optimize("O0"))) static inline uint32_t user_mode()
{ {

View File

@ -1,6 +1,6 @@
# The following three platforms support compatiable instructions. # The following three platforms support compatiable instructions.
ifneq ($(findstring $(BOARD), ok1028a-c), ) ifneq ($(findstring $(BOARD), 3568), )
SRC_DIR := cortex-a72 SRC_DIR := cortex-a55
endif endif

View File

@ -29,7 +29,7 @@ Modification:
1. first version 1. first version
*************************************************/ *************************************************/
/*********cortex-a72 general register************ /*********cortex-a55 general register************
EL0 | EL1 | EL2 | EL3 EL0 | EL1 | EL2 | EL3
x0; x0;
@ -63,7 +63,7 @@ Modification:
x28; x28;
x29; x29;
x30; x30;
*********cortex-a72 special register************ *********cortex-a55 special register************
XZR XZR
PC PC
SP_EL0 SP_EL1 SP_EL2 SP_EL3 SP_EL0 SP_EL1 SP_EL2 SP_EL3

View File

@ -12,7 +12,7 @@
/** /**
* @file core.h * @file core.h
* @brief cortex-a72 core function * @brief cortex-a55 core function
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2024.04.11 * @date 2024.04.11
@ -20,7 +20,7 @@
/************************************************* /*************************************************
File name: core.h File name: core.h
Description: cortex-a72 core function Description: cortex-a55 core function
Others: Others:
History: History:
Author: AIIT XUOS Lab Author: AIIT XUOS Lab
@ -71,7 +71,7 @@ Modification:
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
#include "cortex_a72.h" #include "cortex_a55.h"
#define NR_CPU 4 // maximum number of CPUs #define NR_CPU 4 // maximum number of CPUs
@ -79,15 +79,6 @@ __attribute__((always_inline)) static inline uint64_t EL0_mode() // Set ARM mode
{ {
uint64_t val = 0; uint64_t val = 0;
__asm__ __volatile__(
"mrs %0, spsr_el1"
: "=r"(val)
:
:);
val &= ~DIS_INT;
val &= ~SPSR_MODE_MASK;
val |= ARM_MODE_EL0_t;
return val; return val;
} }

View File

@ -45,30 +45,36 @@ ENTRY( _ENTRY )
ENTRY( _boot_start ) ENTRY( _boot_start )
MEMORY { MEMORY {
phy_ddr3 (rwx) : ORIGIN = 0x0000000040000000, LENGTH = 1024M phy_ddr3 (rwx) : ORIGIN = 0x0000000010000000, LENGTH = 1024M
vir_ddr3 (rwx) : ORIGIN = 0x0000006040635000, LENGTH = 1024M vir_ddr3 (rwx) : ORIGIN = 0x000000601040E000, LENGTH = 1024M
} }
SECTIONS SECTIONS
{ {
.start_sec : { .start_sec : {
. = ALIGN(0x1000); . = ORIGIN(phy_ddr3);
/* initialization start checkpoint. */ /* initialization start checkpoint. */
boot.o(.text) _start_image_addr = .;
bootmmu.o(.text .text.*)
boot.o(.rodata .rodata.*) boot.o(.text)
bootmmu.o(.rodata .rodata.*) bootmmu.o(.text .text.*)
/* ns16550.o(.text .text.*) */
boot.o(.data .data.*) boot.o(.rodata .rodata.*)
bootmmu.o(.data .data.*) bootmmu.o(.rodata .rodata.*)
/* ns16550.o(.rodata .rodata.*) */
PROVIDE(boot_start_addr = .); boot.o(.data .data.*)
bootmmu.o(.data .data.*)
/* ns16550.o(.data .data.*) */
boot.o(.bss .bss.* COMMON) PROVIDE(boot_start_addr = .);
bootmmu.o(.bss .bss.* COMMON)
boot.o(.bss .bss.* COMMON)
bootmmu.o(.bss .bss.* COMMON)
/* ns16550.o(.bss .bss.* COMMON) */
/* stack for booting code. */ /* stack for booting code. */
. = ALIGN(0x1000); . = ALIGN(0x1000);
@ -81,7 +87,7 @@ SECTIONS
PROVIDE(boot_end_addr = .); PROVIDE(boot_end_addr = .);
} > phy_ddr3 } > phy_ddr3
.text : AT(0x40635000) { .text : AT(0x1040E000) {
. = ALIGN(0x1000); . = ALIGN(0x1000);
*(.text .text.* .gnu.linkonce.t.*) *(.text .text.* .gnu.linkonce.t.*)
} > vir_ddr3 } > vir_ddr3
@ -103,17 +109,19 @@ SECTIONS
PROVIDE(_binary_default_fs_start = .); PROVIDE(_binary_default_fs_start = .);
*(.rawdata_memfs*) *(.rawdata_memfs*)
PROVIDE(_binary_default_fs_end = .); PROVIDE(_binary_default_fs_end = .);
PROVIDE(__init_array_start = .);
PROVIDE(__init_array_end = .);
} > vir_ddr3 } > vir_ddr3
. = ALIGN(0x1000); . = ALIGN(0x1000);
PROVIDE(kernel_data_begin = .); _image_size = . - 0x0000006010000000;
_image_size = . - 0x0000006040000000;
.bss : { .bss : {
PROVIDE(kernel_data_begin = .);
PROVIDE(__bss_start__ = .); PROVIDE(__bss_start__ = .);
*(.bss .bss.* COMMON) *(.bss .bss.* COMMON)
. = ALIGN(0x1000);
PROVIDE(__bss_end__ = .); PROVIDE(__bss_end__ = .);
PROVIDE(kernel_data_end = .);
} > vir_ddr3 } > vir_ddr3
. = ALIGN(0x1000);
PROVIDE(kernel_data_end = .);
} }

View File

@ -1,5 +1,6 @@
SRC_FILES := boot.S \ SRC_FILES := boot.S \
xizi_smp.S \
smp.c \ smp.c \
cortexA72.S cortexA55.S
include $(KERNEL_ROOT)/compiler.mk include $(KERNEL_ROOT)/compiler.mk

View File

@ -0,0 +1,168 @@
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
#include "core.h"
#define HCR_VALUE (1 << 31)
#define SPSR_EL2_VALUE (7 << 6) | (5 << 0)
#define SCTLR_EL1_VALUE (0x30D00800)
/* Macros for MAIR setting. */
#define MAIR(attr, mt) ((attr) << ((mt) * 8))
#define MT_DEVICE_nGnRnE 0
#define MT_DEVICE_nGnRE 1
#define MT_DEVICE_GRE 2
#define MT_NORMAL_NC 3
#define MT_NORMAL 4
#define MT_NORMAL_WT 5
.section ".text", "ax"
.global _boot_start
.global primary_cpu_init
.global el2_setup
/* The function for setting memory types and MAIR registers. */
.global __cpu_mair_setup
_boot_start:
bl el2_setup
/* set NSACR, both Secure and Non-secure access are allowed to NEON */
mov x0, #(3 << 20)
msr cpacr_el1, x0
isb
// clear some registers
msr elr_el1, XZR
ldr x0, =stacks_top
mov x1, #MODE_STACK_SIZE
// get cpu id, and subtract the offset from the stacks base address
mrs x2, mpidr_el1
and x2, x2, #0xFFF
lsr x2, x2, #8
mov x5, x2
mul x3, x2, x1
sub x0, x0, x3
mov sp, x0
mov x2, #ARM_MODE_EL1_h | DIS_INT
msr spsr_el1, x2
// check cpu id - cpu0 is primary cpu
mrs x2, mpidr_el1
and x2, x2, #0xFFF
lsr x2, x2, #8
mov x5, x2
cmp x5, #0
beq primary_cpu_init
bl __cpu_mair_setup
bl bootmain // for secondary cpus, jump to argument function pointer passed in by ROM
bl .
primary_cpu_init:
/* init .bss */
/* clear the .bss section (zero init) */
ldr x1, =boot_start_addr
ldr x2, =boot_end_addr
mov x3, #0
1:
cmp x1, x2
stp x3, x3, [x1], #16
b.lt 1b
bl __cpu_mair_setup
bl bootmain
.func el2_setup
el2_setup:
mrs x0, CurrentEL
lsr x0, x0, #2
and x0, x0, #3
cmp x0, #2
beq 1f
ret
/* Hyp configuration. */
1:
mov x0, #(1 << 31)
msr hcr_el2, x0
/* Generic timers. */
mrs x0, cnthctl_el2
orr x0, x0, #3 // Enable EL1 physicaltimers
msr cnthctl_el2, x0
/* Populate ID registers. */
mrs x0, midr_el1
mrs x1, mpidr_el1
msr vpidr_el2, x0
msr vmpidr_el2, x1
/* Disable Coprocessor traps. */
mov x0, #0x33ff
msr cptr_el2, x0 // Disable copro. traps to EL2
msr hstr_el2, xzr // Disable CP15 traps to EL2
mov x0, sp
msr sp_el1, x0
mrs x0, sctlr_el1
orr x0, x0, #(1 << 0)
bic x0, x0, #(1 << 1)
orr x0, x0, #(1 << 2)
msr sctlr_el1, x0
/* spsr */
mov x0, #SPSR_EL2_VALUE
msr spsr_el2, x0
msr elr_el2, lr
eret
.endfunc
.func __cpu_mair_setup
__cpu_mair_setup:
tlbi vmalle1 // Invalidate local TLB
dsb nsh
// mov x0, #3 << 20
// msr cpacr_el1, x0 // Enable FP/ASIMD
// mov x0, #1 << 12 // Reset mdscr_el1 and disable
// msr mdscr_el1, x0 // access to the DCC from EL0
isb // Unmask debug exceptions now,
// enable_dbg // since this is per-cpu
/*
* Memory region attributes for LPAE:
*
* n = AttrIndx[2:0]
* n MAIR
* DEVICE_nGnRnE 000 00000000
* DEVICE_nGnRE 001 00000100
* DEVICE_GRE 010 00001100
* NORMAL_NC 011 01000100
* NORMAL 100 11111111
* NORMAL_WT 101 10111011
*/
ldr x5, =MAIR(0x00, MT_DEVICE_nGnRnE) | \
MAIR(0x04, MT_DEVICE_nGnRE) | \
MAIR(0x0c, MT_DEVICE_GRE) | \
MAIR(0x44, MT_NORMAL_NC) | \
MAIR(0xff, MT_NORMAL) | \
MAIR(0xbb, MT_NORMAL_WT)
msr mair_el1, x5
ret
.endfunc
.end

View File

@ -1,8 +1,7 @@
export CROSS_COMPILE ?= aarch64-none-elf- export CROSS_COMPILE ?= aarch64-none-elf-
export DEVICE = -mtune=cortex-a72 -ffreestanding -fno-common -fno-stack-protector -fno-pie -no-pie export DEVICE = -mtune=cortex-a55 -ffreestanding -fno-common -fno-stack-protector -fno-pie -no-pie
export CFLAGS := $(DEVICE) -Wall -Werror -O2 -g -fno-omit-frame-pointer -fPIC export CFLAGS := $(DEVICE) -Wall -Werror -O2 -g -fno-omit-frame-pointer -fPIC
# export AFLAGS := -c $(DEVICE) -x assembler-with-cpp -D__ASSEMBLY__ -gdwarf-2 export LFLAGS := $(DEVICE) -Wl,-T -Wl,$(KERNEL_ROOT)/hardkernel/arch/arm/armv8-a/cortex-a55/preboot_for_3568/3568.lds -Wl,--start-group,-lgcc,-lc,--end-group
export LFLAGS := $(DEVICE) -Wl,-T -Wl,$(KERNEL_ROOT)/hardkernel/arch/arm/armv8-a/cortex-a72/preboot_for_ok1028a-c/nxp_ls1028.lds -Wl,--start-group,-lgcc,-lc,--end-group
export CXXFLAGS := export CXXFLAGS :=
export DEFINES := -DHAVE_CCONFIG_H -DCHIP_LS1028 export DEFINES := -DHAVE_CCONFIG_H -DCHIP_LS1028

View File

@ -1,14 +1,14 @@
/*! /*!
* @file cortexA72.s * @file cortexA55.s
* @brief This file contains cortexA72 functions * @brief This file contains cortexA55 functions
* *
*/ */
/************************************************* /*************************************************
File name: cortexA72.S File name: cortexA55.S
Description: This file contains cortexA9 functions Description: This file contains cortexA9 functions
Others: Others:
History: History:
1. Date: 202-05-08 1. Date: 2024-05-08
Author: AIIT XUOS Lab Author: AIIT XUOS Lab
Modification: Modification:
1. No modifications 1. No modifications
@ -21,7 +21,8 @@ Modification:
.func cpu_get_current .func cpu_get_current
cpu_get_current: cpu_get_current:
mrs x0, mpidr_el1 mrs x0, mpidr_el1
and x0, x0, #3 and x0, x0, #0xFFF
lsr x0, x0, #8
ret ret
.endfunc .endfunc
@ -32,6 +33,6 @@ psci_call:
# ------------------------------------------------------------ # ------------------------------------------------------------
# End of cortexA72.s # End of cortexA55.s
# ------------------------------------------------------------ # ------------------------------------------------------------
.end .end

View File

@ -28,16 +28,16 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
/** /**
* @file cortex_a72.h * @file cortex_a55.h
* @brief some cortex A72 core functions * @brief some cortex A55 core functions
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2024.04.24 * @date 2024.04.24
*/ */
/************************************************* /*************************************************
File name: cortex_a72.h File name: cortex_a55.h
Description: some cortex A72 core functions Description: some cortex A55 core functions
Others: Others:
History: History:
Author: AIIT XUOS Lab Author: AIIT XUOS Lab
@ -45,8 +45,8 @@ Modification:
1. No modifications 1. No modifications
*************************************************/ *************************************************/
#if !defined(__CORTEX_A72_H__) #if !defined(__CORTEX_A55_H__)
#define __CORTEX_A72_H__ #define __CORTEX_A55_H__
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
@ -231,4 +231,4 @@ void scu_secure_invalidate(unsigned int cpu, unsigned int ways);
} }
#endif #endif
#endif //__CORTEX_A72_H__ #endif //__CORTEX_A55_H__

View File

@ -48,12 +48,34 @@ Modification:
#include <stdint.h> #include <stdint.h>
#define PSCI_CPUON 0xc4000003 #define PSCI_CPUON 0xc4000003
struct xizi_smccc_res {
unsigned long a0;
unsigned long a1;
unsigned long a2;
unsigned long a3;
};
extern void _boot_start(); extern void _boot_start();
void psci_call(uint64_t fn, uint8_t cpuid, uint64_t entry, uint64_t ctxid); extern void __print();
extern void __xizi_smccc_smc(unsigned long a0, unsigned long a1, unsigned long a2,
unsigned long a3, unsigned long a4, unsigned long a5,
unsigned long a6, unsigned long a7, struct xizi_smccc_res* res);
static struct xizi_smccc_res __invoke_sip_fn_smc(unsigned long function_id,
unsigned long arg0,
unsigned long arg1,
unsigned long arg2)
{
struct xizi_smccc_res res;
__xizi_smccc_smc(function_id, arg0, arg1, arg2, 0, 0, 0, 0, &res);
return res;
}
void cpu_start_secondary(uint8_t cpu_id) void cpu_start_secondary(uint8_t cpu_id)
{ {
psci_call(PSCI_CPUON, cpu_id, (uintptr_t)&_boot_start, 0); __invoke_sip_fn_smc(PSCI_CPUON, cpu_id, (uintptr_t)0xa00000, 0);
} }
void start_smp_cache_broadcast(int cpu_id) void start_smp_cache_broadcast(int cpu_id)

View File

@ -0,0 +1,27 @@
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
.global __xizi_smccc_smc
.func __xizi_smccc_smc
__xizi_smccc_smc:
smc #0
ldr x4, [sp]
stp x0, x1, [x4, #0]
stp x2, x3, [x4, #16]
ldr x4, [sp, #8]
cbz x4, 1f /* no quirk structure */
ldr x9, [x4, #0]
cmp x9, #1
b.ne 1f
str x6, [x4, 8]
1: ret
.endfunc

View File

@ -1,81 +0,0 @@
// #include "memlayout.h"
#include "core.h"
// #include "registers.h"
// #include "cortex_a72.h"
// qemu -kernel loads the kernel at 0x40000000
// and causes each CPU to jump there.
// kernel.ld causes the following code to
// be placed at 0x40000000.
.section ".text"
//.global _entry
.global _boot_start
.global primary_cpu_init
_boot_start:
// set up a stack for C.
// stack0 is declared in start.c,
// with a 4096-byte stack per CPU.
// sp = stack0 + ((cpuid+1) * 4096)
// cpuid = mpidr_el1 & 0xff
// save r0 for cores 1-3, r0 arg field passed by ROM
// r0 is a function pointer for secondary cpus
// mov x4, x0
mrs x0, spsr_el1 /* Enter EL1 (Exception Level 1) */
bic x0, x0, #0x1f
MOV x1, #0xC5
ORR x0, x0, x1
msr spsr_el1, x0
/* set NSACR, both Secure and Non-secure access are allowed to NEON */
MRS X1, CPACR_EL1
ORR X1, X1, #(0X3 << 20)
MSR CPACR_EL1, X1
ISB
// clear some registers
msr elr_el1, XZR
ldr x0, =stacks_top
mov x1, #MODE_STACK_SIZE
// get cpu id, and subtract the offset from the stacks base address
mrs x2, mpidr_el1
and x2, x2, #0x3
mov x5, x2
mul x3, x2, x1
sub x0, x0, x3
MOV X2, #ARM_MODE_EL1_h | DIS_INT
MSR SPSR_EL1, X2
mov sp, x0
SUB x0, x0,x1
// check cpu id - cpu0 is primary cpu
cmp x5, #0
beq primary_cpu_init
bl bootmain // for secondary cpus, jump to argument function pointer passed in by ROM
bl .
primary_cpu_init:
/* init .bss */
/* clear the .bss section (zero init) */
ldr x1, =boot_start_addr
ldr x2, =boot_end_addr
mov x3, #0
1:
cmp x1, x2
stp x3, x3, [x1], #16
b.lt 1b
// branch to c library entry point
mov x0, #0 // argc
mov x1, #0 // argv
mov x2, #0 // env
bl bootmain
.end

View File

@ -1,8 +1,8 @@
ifneq ($(findstring $(BOARD), imx6q-sabrelite zynq7000-zc702), ) ifneq ($(findstring $(BOARD), imx6q-sabrelite zynq7000-zc702), )
SRC_DIR := cortex-a9 SRC_DIR := cortex-a9
endif endif
ifneq ($(findstring $(BOARD), ok1028a-c), ) ifneq ($(findstring $(BOARD), 3568), )
SRC_DIR := cortex-a72 SRC_DIR := cortex-a55
endif endif
include $(KERNEL_ROOT)/compiler.mk include $(KERNEL_ROOT)/compiler.mk

View File

@ -1,3 +1,3 @@
SRC_FILES := l1_cache.c SRC_FILES := l1_cache.c cache.S
include $(KERNEL_ROOT)/compiler.mk include $(KERNEL_ROOT)/compiler.mk

View File

@ -0,0 +1,336 @@
/*
* (C) Copyright 2013
* David Feng <fenghua@phytium.com.cn>
*
* This file is based on sample code from ARMv8 ARM.
*
* SPDX-License-Identifier: GPL-2.0+
*/
#define ASM_NL ;
#define SYMBOL_NAME(X) X
// #define SYMBOL_NAME_LABEL(X) X##:
#define SYMBOL_NAME_LABEL(X) X:
#ifndef __ALIGN
#define __ALIGN .align 4
#endif
#ifndef __ALIGN_STR
#define __ALIGN_STR ".align 4"
#endif
#define ALIGN __ALIGN
#define ALIGN_STR __ALIGN_STR
#define LENTRY(name) \
ALIGN ASM_NL \
SYMBOL_NAME_LABEL(name)
#define ENTRY(name) \
.globl SYMBOL_NAME(name) ASM_NL \
LENTRY(name)
#define WEAK(name) \
.weak SYMBOL_NAME(name) ASM_NL \
LENTRY(name)
#define END(name) \
.size name, .-name
#define ENDPROC(name) \
.type name STT_FUNC ASM_NL \
END(name)
#define CR_M (1 << 0) /* MMU enable */
#define CR_A (1 << 1) /* Alignment abort enable */
#define CR_C (1 << 2) /* Dcache enable */
#define CR_SA (1 << 3) /* Stack Alignment Check Enable */
#define CR_I (1 << 12) /* Icache enable */
#define CR_WXN (1 << 19) /* Write Permision Imply XN */
#define CR_EE (1 << 25) /* Exception (Big) Endian */
.macro switch_el, xreg, el3_label, el2_label, el1_label
mrs \xreg, CurrentEL
cmp \xreg, 0xc
b.eq \el3_label
cmp \xreg, 0x8
b.eq \el2_label
cmp \xreg, 0x4
b.eq \el1_label
.endm
/*
* void __asm_dcache_level(level)
* flush or invalidate one level cache.
*
* x0: cache level
* x1: 0 clean & invalidate, 1 invalidate only
* x2~x9: clobbered
*/
ENTRY(__asm_dcache_level)
lsl x12, x0, #1
msr csselr_el1, x12 /* select cache level */
isb /* sync change of cssidr_el1 */
mrs x6, ccsidr_el1 /* read the new cssidr_el1 */
and x2, x6, #7 /* x2 <- log2(cache line size)-4 */
add x2, x2, #4 /* x2 <- log2(cache line size) */
mov x3, #0x3ff
and x3, x3, x6, lsr #3 /* x3 <- max number of #ways */
clz w5, w3 /* bit position of #ways */
mov x4, #0x7fff
and x4, x4, x6, lsr #13 /* x4 <- max number of #sets */
/* x12 <- cache level << 1 */
/* x2 <- line length offset */
/* x3 <- number of cache ways - 1 */
/* x4 <- number of cache sets - 1 */
/* x5 <- bit position of #ways */
loop_set:
mov x6, x3 /* x6 <- working copy of #ways */
loop_way:
lsl x7, x6, x5
orr x9, x12, x7 /* map way and level to cisw value */
lsl x7, x4, x2
orr x9, x9, x7 /* map set number to cisw value */
tbz w1, #0, 1f
dc isw, x9
b 2f
1: dc cisw, x9 /* clean & invalidate by set/way */
2: subs x6, x6, #1 /* decrement the way */
b.ge loop_way
subs x4, x4, #1 /* decrement the set */
b.ge loop_set
ret
ENDPROC(__asm_dcache_level)
/*
* void __asm_flush_dcache_all(int invalidate_only)
*
* x0: 0 clean & invalidate, 1 invalidate only
*
* flush or invalidate all data cache by SET/WAY.
*/
ENTRY(__asm_dcache_all)
mov x1, x0
dsb sy
mrs x10, clidr_el1 /* read clidr_el1 */
lsr x11, x10, #24
and x11, x11, #0x7 /* x11 <- loc */
cbz x11, finished /* if loc is 0, exit */
mov x15, lr
mov x0, #0 /* start flush at cache level 0 */
/* x0 <- cache level */
/* x10 <- clidr_el1 */
/* x11 <- loc */
/* x15 <- return address */
loop_level:
lsl x12, x0, #1
add x12, x12, x0 /* x0 <- tripled cache level */
lsr x12, x10, x12
and x12, x12, #7 /* x12 <- cache type */
cmp x12, #2
b.lt skip /* skip if no cache or icache */
bl __asm_dcache_level /* x1 = 0 flush, 1 invalidate */
skip:
add x0, x0, #1 /* increment cache level */
cmp x11, x0
b.gt loop_level
mov x0, #0
msr csselr_el1, x0 /* restore csselr_el1 */
dsb sy
isb
mov lr, x15
finished:
ret
ENDPROC(__asm_dcache_all)
ENTRY(__asm_flush_dcache_all)
mov x0, #0
b __asm_dcache_all
ENDPROC(__asm_flush_dcache_all)
ENTRY(__asm_invalidate_dcache_all)
mov x0, #0x1
b __asm_dcache_all
ENDPROC(__asm_invalidate_dcache_all)
/*
* void __asm_flush_dcache_range(start, end)
*
* clean & invalidate data cache in the range
*
* x0: start address
* x1: end address
*/
ENTRY(__asm_flush_dcache_range)
isb
mrs x3, ctr_el0
lsr x3, x3, #16
and x3, x3, #0xf
mov x2, #4
lsl x2, x2, x3 /* cache line size */
/* x2 <- minimal cache line size in cache system */
sub x3, x2, #1
bic x0, x0, x3
1: dc civac, x0 /* clean & invalidate data or unified cache */
add x0, x0, x2
cmp x0, x1
b.lo 1b
dsb sy
isb
ret
ENDPROC(__asm_flush_dcache_range)
/*
* void __asm_invalidate_dcache_range(start, end)
*
* invalidate data cache in the range
*
* x0: start address
* x1: end address
*/
ENTRY(__asm_invalidate_dcache_range)
mrs x3, ctr_el0
ubfm x3, x3, #16, #19
mov x2, #4
lsl x2, x2, x3 /* cache line size */
/* x2 <- minimal cache line size in cache system */
sub x3, x2, #1
bic x0, x0, x3
1: dc ivac, x0 /* invalidate data or unified cache */
add x0, x0, x2
cmp x0, x1
b.lo 1b
dsb sy
isb
ret
ENDPROC(__asm_invalidate_dcache_range)
/*
* void __asm_invalidate_icache_all(void)
*
* invalidate all tlb entries.
*/
ENTRY(__asm_invalidate_icache_all)
ic ialluis
isb sy
ret
ENDPROC(__asm_invalidate_icache_all)
ENTRY(__asm_invalidate_l3_dcache)
mov x0, #0 /* return status as success */
ret
ENDPROC(__asm_invalidate_l3_dcache)
.weak __asm_invalidate_l3_dcache
ENTRY(__asm_flush_l3_dcache)
mov x0, #0 /* return status as success */
ret
ENDPROC(__asm_flush_l3_dcache)
.weak __asm_flush_l3_dcache
ENTRY(__asm_invalidate_l3_icache)
mov x0, #0 /* return status as success */
ret
ENDPROC(__asm_invalidate_l3_icache)
.weak __asm_invalidate_l3_icache
/*
* void __asm_switch_ttbr(ulong new_ttbr)
*
* Safely switches to a new page table.
*/
ENTRY(__asm_switch_ttbr)
/* x2 = SCTLR (alive throghout the function) */
switch_el x4, 3f, 2f, 1f
3: mrs x2, sctlr_el3
b 0f
2: mrs x2, sctlr_el2
b 0f
1: mrs x2, sctlr_el1
0:
/* Unset CR_M | CR_C | CR_I from SCTLR to disable all caches */
movn x1, #(CR_M | CR_C | CR_I)
and x1, x2, x1
switch_el x4, 3f, 2f, 1f
3: msr sctlr_el3, x1
b 0f
2: msr sctlr_el2, x1
b 0f
1: msr sctlr_el1, x1
0: isb
/* This call only clobbers x30 (lr) and x9 (unused) */
mov x3, x30
bl __asm_invalidate_tlb_all
/* From here on we're running safely with caches disabled */
/* Set TTBR to our first argument */
switch_el x4, 3f, 2f, 1f
3: msr ttbr0_el3, x0
b 0f
2: msr ttbr0_el2, x0
b 0f
1: msr ttbr0_el1, x0
0: isb
/* Restore original SCTLR and thus enable caches again */
switch_el x4, 3f, 2f, 1f
3: msr sctlr_el3, x2
b 0f
2: msr sctlr_el2, x2
b 0f
1: msr sctlr_el1, x2
0: isb
ret x3
ENDPROC(__asm_switch_ttbr)
ENTRY(__asm_invalidate_tlb_all)
switch_el x9, 3f, 2f, 1f
3: tlbi alle3
dsb sy
isb
b 0f
2: tlbi alle2
dsb sy
isb
b 0f
1: tlbi vmalle1
dsb sy
isb
0:
ret
ENDPROC(__asm_invalidate_tlb_all)

View File

@ -20,6 +20,10 @@ Modification:
*************************************************/ *************************************************/
#include "l1_cache.h" #include "l1_cache.h"
extern void __asm_flush_dcache_all();
extern void __asm_flush_l3_dcache();
extern void __asm_invalidate_icache_all();
extern void __asm_invalidate_l3_icache();
void InvalidateL1Dcache(uintptr_t start, uintptr_t end) void InvalidateL1Dcache(uintptr_t start, uintptr_t end)
{ {
@ -153,34 +157,14 @@ void FlushL1Dcache(uintptr_t start, uintptr_t end)
void FlushL1DcacheAll(void) void FlushL1DcacheAll(void)
{ {
uint64_t ccsidr_el1; // Cache Size ID __asm_flush_dcache_all();
int num_sets; // number of sets __asm_flush_l3_dcache();
int num_ways; // number of ways
uint32_t wayset; // wayset parameter
__asm__ __volatile__("mrs %0, ccsidr_el1" : "=r"(ccsidr_el1)); // Read Cache Size ID
// Fill number of sets and number of ways from ccsidr_el1 register This walues are decremented by 1
num_sets = ((ccsidr_el1 >> 32) & 0x7FFF) + 1;
num_ways = ((ccsidr_el1 >> 0) & 0x7FFF) + 1;
// clean and invalidate all lines (all Sets in all ways)
for (int way = 0; way < num_ways; way++) {
for (int set = 0; set < num_sets; set++) {
wayset = (way << 30) | (set << 5);
__asm__ __volatile__("dc cisw, %0" : : "r"(wayset));
}
}
// All Cache, Branch predictor and TLB maintenance operations before followed instruction complete
DSB();
} }
void InvalidateL1IcacheAll() void InvalidateL1IcacheAll()
{ {
__asm__ __volatile__("ic iallu\n\t"); __asm_invalidate_icache_all();
// synchronize context on this processor __asm_invalidate_l3_icache();
ISB();
} }
void InvalidateL1Icache(uintptr_t start, uintptr_t end) void InvalidateL1Icache(uintptr_t start, uintptr_t end)

View File

@ -92,7 +92,7 @@ static inline void invalidate_icache(uintptr_t start, uintptr_t end)
static inline void invalidate_icache_all(void) static inline void invalidate_icache_all(void)
{ {
// InvalidateL1IcacheAll(); InvalidateL1IcacheAll();
} }
/**************************************************************************** /****************************************************************************
@ -151,7 +151,7 @@ static inline void flush_dcache(uintptr_t start, uintptr_t end)
static inline void flush_dcache_all(void) static inline void flush_dcache_all(void)
{ {
// FlushL1DcacheAll(); FlushL1DcacheAll();
// FlushL2CacheAll(); // FlushL2CacheAll();
} }

View File

@ -1,4 +1,4 @@
ifneq ($(findstring $(BOARD), ok1028a-c), ) ifneq ($(findstring $(BOARD), 3568), )
SRC_DIR := armv8-a SRC_DIR := armv8-a
endif endif
ifneq ($(findstring $(BOARD), imx6q-sabrelite zynq7000-zc702), ) ifneq ($(findstring $(BOARD), imx6q-sabrelite zynq7000-zc702), )

View File

@ -1,5 +1,5 @@
ifneq ($(findstring $(BOARD), ok1028a-c), ) ifneq ($(findstring $(BOARD), 3568), )
SRC_DIR := cortex-a72 SRC_DIR := cortex-a55
endif endif

View File

@ -22,27 +22,27 @@
static void enable_timer() static void enable_timer()
{ {
uint32_t c = r_cntv_ctl_el0(); uint32_t c = r_cntp_ctl_el0();
c |= CNTV_CTL_ENABLE; c |= CNTV_CTL_ENABLE;
c &= ~CNTV_CTL_IMASK; c &= ~CNTV_CTL_IMASK;
w_cntv_ctl_el0(c); w_cntp_ctl_el0(c);
} }
static void disable_timer() static void disable_timer()
{ {
uint32_t c = r_cntv_ctl_el0(); uint32_t c = r_cntp_ctl_el0();
c |= CNTV_CTL_IMASK; c |= CNTV_CTL_IMASK;
c &= ~CNTV_CTL_ENABLE; c &= ~CNTV_CTL_ENABLE;
w_cntv_ctl_el0(c); w_cntp_ctl_el0(c);
} }
static void reload_timer() static void reload_timer()
{ {
// interval 100ms // interval 1ms
static uint32_t ms = 10; static uint32_t ms = 1;
uint32_t interval = ms * 1000; uint32_t interval = ms * 1000;
uint32_t interval_clk = interval * (r_cntfrq_el0() / 1000000); uint32_t interval_clk = interval * (r_cntfrq_el0() / 1000000);
w_cntv_tval_el0(interval_clk); w_cntp_tval_el0(interval_clk);
} }
void _sys_clock_init() void _sys_clock_init()
@ -54,7 +54,7 @@ void _sys_clock_init()
static uint32_t _get_clock_int() static uint32_t _get_clock_int()
{ {
return 27; return 30;
} }
static uint64_t _get_tick() static uint64_t _get_tick()
@ -64,7 +64,7 @@ static uint64_t _get_tick()
static uint64_t _get_second() static uint64_t _get_second()
{ {
return 0; return _get_tick() / r_cntfrq_el0();
} }
static bool _is_timer_expired() static bool _is_timer_expired()

View File

@ -15,28 +15,28 @@
#include <stdint.h> #include <stdint.h>
// armv8 generic timer // armv8 generic timer
static inline uint32_t r_cntv_ctl_el0() static inline uint32_t r_cntp_ctl_el0()
{ {
uint32_t x; uint32_t x;
__asm__ volatile("mrs %0, cntv_ctl_el0" : "=r"(x)); __asm__ volatile("mrs %0, cntp_ctl_el0" : "=r"(x));
return x; return x;
} }
static inline void w_cntv_ctl_el0(uint32_t x) static inline void w_cntp_ctl_el0(uint32_t x)
{ {
__asm__ volatile("msr cntv_ctl_el0, %0" : : "r"(x)); __asm__ volatile("msr cntp_ctl_el0, %0" : : "r"(x));
} }
static inline uint32_t r_cntv_tval_el0() static inline uint32_t r_cntp_tval_el0()
{ {
uint32_t x; uint32_t x;
__asm__ volatile("mrs %0, cntv_tval_el0" : "=r"(x)); __asm__ volatile("mrs %0, cntp_tval_el0" : "=r"(x));
return x; return x;
} }
static inline void w_cntv_tval_el0(uint32_t x) static inline void w_cntp_tval_el0(uint32_t x)
{ {
__asm__ volatile("msr cntv_tval_el0, %0" : : "r"(x)); __asm__ volatile("msr cntp_tval_el0, %0" : : "r"(x));
} }
static inline uint64_t r_cntvct_el0() static inline uint64_t r_cntvct_el0()

View File

@ -220,6 +220,7 @@ bool secondary_cpu_hardkernel_init(int cpu_id, struct TraceTag* _hardkernel_tag)
p_icache_driver->enable(); p_icache_driver->enable();
p_dcache_driver->enable(); p_dcache_driver->enable();
// clock // clock
p_clock_driver->sys_clock_init();
p_intr_driver->single_irq_enable(p_clock_driver->get_clock_int(), cpu_id, 0); p_intr_driver->single_irq_enable(p_clock_driver->get_clock_int(), cpu_id, 0);
// mmu // mmu
secondary_cpu_load_kern_pgdir(&init_mmu_tag, &init_intr_tag); secondary_cpu_load_kern_pgdir(&init_mmu_tag, &init_intr_tag);

View File

@ -1,4 +1,4 @@
ifneq ($(findstring $(BOARD), ok1028a-c), ) ifneq ($(findstring $(BOARD), 3568), )
SRC_DIR := armv8-a SRC_DIR := armv8-a
endif endif
ifneq ($(findstring $(BOARD), imx6q-sabrelite zynq7000-zc702), ) ifneq ($(findstring $(BOARD), imx6q-sabrelite zynq7000-zc702), )

View File

@ -1,3 +1,3 @@
SRC_DIR := cortex-a72 SRC_DIR := cortex-a55
include $(KERNEL_ROOT)/compiler.mk include $(KERNEL_ROOT)/compiler.mk

View File

@ -28,13 +28,16 @@ Modification:
*************************************************/ *************************************************/
#include <stdint.h> #include <stdint.h>
#include "exception_registers.h"
#include "assert.h" #include "assert.h"
#include "core.h" #include "core.h"
#include "exception_registers.h"
#include "multicores.h" #include "multicores.h"
#include "syscall.h" #include "syscall.h"
#include "task.h" #include "task.h"
#include "mmu.h"
extern void dabort_handler(struct trapframe* r); extern void dabort_handler(struct trapframe* r);
extern void iabort_handler(struct trapframe* r); extern void iabort_handler(struct trapframe* r);
@ -73,7 +76,6 @@ void syscall_arch_handler(struct trapframe* tf)
uint64_t esr = r_esr_el1(); uint64_t esr = r_esr_el1();
uint64_t ec = (esr >> 0x1A) & 0x3F; uint64_t ec = (esr >> 0x1A) & 0x3F;
w_esr_el1(0);
switch (ec) { switch (ec) {
case 0B010101: case 0B010101:
software_irq_dispatch(tf); software_irq_dispatch(tf);
@ -87,11 +89,30 @@ void syscall_arch_handler(struct trapframe* tf)
iabort_handler(tf); iabort_handler(tf);
break; break;
default: { default: {
ERROR("USYSCALL: unexpected ec: %016lx", esr); ERROR("USYSCALL: unexpected\n");
ERROR(" esr: %016lx\n", esr);
ERROR(" elr = %016lx far = %016lx\n", r_elr_el1(), r_far_el1()); ERROR(" elr = %016lx far = %016lx\n", r_elr_el1(), r_far_el1());
w_esr_el1(0);
extern void dump_tf(struct trapframe * tf);
dump_tf(tf);
uint32_t sctlr = 0;
SCTLR_R(sctlr);
DEBUG("SCTLR: %x\n", sctlr);
uint32_t spsr = 0;
__asm__ volatile("mrs %0, spsr_el1" : "=r"(spsr)::"memory");
DEBUG("SPSR: %x\n", spsr);
uint64_t tcr = 0;
__asm__ volatile("mrs %0, tcr_el1" : "=r"(tcr)::"memory");
DEBUG("TCR: %x\n", tcr);
uint64_t mair = 0;
__asm__ volatile("mrs %0, mair_el1" : "=r"(mair)::"memory");
DEBUG("MAIR: %x\n", mair);
// kill error task // kill error task
xizi_enter_kernel(); xizi_enter_kernel();
assert(cur_cpu()->task != NULL); assert(cur_cpu()->task != NULL);
ERROR("Error Task: %s\n", cur_cpu()->task->name);
sys_exit(cur_cpu()->task); sys_exit(cur_cpu()->task);
context_switch(&cur_cpu()->task->thread_context.context, cur_cpu()->scheduler); context_switch(&cur_cpu()->task->thread_context.context, cur_cpu()->scheduler);
panic("dabort end should never be reashed.\n"); panic("dabort end should never be reashed.\n");

View File

@ -29,7 +29,7 @@ Modification:
#include <string.h> #include <string.h>
#include "core.h" #include "core.h"
#include "cortex_a72.h" #include "cortex_a55.h"
#include "exception_registers.h" #include "exception_registers.h"
#include "gicv3_common_opa.h" #include "gicv3_common_opa.h"
#include "trap_common.h" #include "trap_common.h"
@ -70,7 +70,12 @@ static void _cpu_irq_disable(void)
static void _single_irq_enable(int irq, int cpu, int prio) static void _single_irq_enable(int irq, int cpu, int prio)
{ {
gic_setup_ppi((uint32_t)cpu, (uint32_t)irq); if (irq < 32) {
gic_setup_ppi((uint32_t)cpu, (uint32_t)irq);
}
else {
gic_setup_spi((uint32_t)cpu, (uint32_t)irq);
}
} }
static void _single_irq_disable(int irq, int cpu) static void _single_irq_disable(int irq, int cpu)

View File

@ -1,6 +1,6 @@
SRC_FILES := trampoline.S $(BOARD)/trap_common.c $(BOARD)/trap.c error_debug.c hard_spinlock.S SRC_FILES := trampoline.S $(BOARD)/trap_common.c $(BOARD)/trap.c error_debug.c hard_spinlock.S
ifeq ($(BOARD), ok1028a-c) ifeq ($(BOARD), 3568)
SRC_DIR := gicv3 SRC_DIR := gicv3
SRC_FILES += $(BOARD)/ SRC_FILES += $(BOARD)/
endif endif

View File

@ -39,51 +39,53 @@ Modification:
2. Modify iabort and dabort handler(in dabort_handler() and iabort_handler()) 2. Modify iabort and dabort handler(in dabort_handler() and iabort_handler())
*************************************************/ *************************************************/
#include <stddef.h> #include <stddef.h>
#include <stdint.h>
#include "exception_registers.h"
#include "assert.h" #include "assert.h"
#include "core.h" #include "core.h"
#include "log.h" #include "log.h"
#include "multicores.h" #include "multicores.h"
#include "spinlock.h"
#include "task.h" #include "task.h"
#include "trap_common.h" #include "trap_common.h"
void dump_tf(struct trapframe* tf) void dump_tf(struct trapframe* tf)
{ {
KPrintf(" sp: 0x%x\n", tf->sp); KPrintf(" sp: 0x%016lx\n", tf->sp);
KPrintf(" pc: 0x%x\n", tf->pc); KPrintf(" pc: 0x%016lx\n", tf->pc);
KPrintf(" spsr: 0x%x\n", tf->spsr); KPrintf(" spsr: 0x%016lx\n", tf->spsr);
KPrintf(" x0: 0x%x\n", tf->x0); KPrintf(" x0: 0x%016lx\n", tf->x0);
KPrintf(" x1: 0x%x\n", tf->x1); KPrintf(" x1: 0x%016lx\n", tf->x1);
KPrintf(" x2: 0x%x\n", tf->x2); KPrintf(" x2: 0x%016lx\n", tf->x2);
KPrintf(" x3: 0x%x\n", tf->x3); KPrintf(" x3: 0x%016lx\n", tf->x3);
KPrintf(" x4: 0x%x\n", tf->x4); KPrintf(" x4: 0x%016lx\n", tf->x4);
KPrintf(" x5: 0x%x\n", tf->x5); KPrintf(" x5: 0x%016lx\n", tf->x5);
KPrintf(" x6: 0x%x\n", tf->x6); KPrintf(" x6: 0x%016lx\n", tf->x6);
KPrintf(" x7: 0x%x\n", tf->x7); KPrintf(" x7: 0x%016lx\n", tf->x7);
KPrintf(" x8: 0x%x\n", tf->x8); KPrintf(" x8: 0x%016lx\n", tf->x8);
KPrintf(" x9: 0x%x\n", tf->x9); KPrintf(" x9: 0x%016lx\n", tf->x9);
KPrintf(" x10: 0x%x\n", tf->x10); KPrintf(" x10: 0x%016lx\n", tf->x10);
KPrintf(" x11: 0x%x\n", tf->x11); KPrintf(" x11: 0x%016lx\n", tf->x11);
KPrintf(" x12: 0x%x\n", tf->x12); KPrintf(" x12: 0x%016lx\n", tf->x12);
KPrintf(" x13: 0x%x\n", tf->x13); KPrintf(" x13: 0x%016lx\n", tf->x13);
KPrintf(" x14: 0x%x\n", tf->x14); KPrintf(" x14: 0x%016lx\n", tf->x14);
KPrintf(" x15: 0x%x\n", tf->x15); KPrintf(" x15: 0x%016lx\n", tf->x15);
KPrintf(" x16: 0x%x\n", tf->x16); KPrintf(" x16: 0x%016lx\n", tf->x16);
KPrintf(" x17: 0x%x\n", tf->x17); KPrintf(" x17: 0x%016lx\n", tf->x17);
KPrintf(" x18: 0x%x\n", tf->x18); KPrintf(" x18: 0x%016lx\n", tf->x18);
KPrintf(" x19: 0x%x\n", tf->x19); KPrintf(" x19: 0x%016lx\n", tf->x19);
KPrintf(" x20: 0x%x\n", tf->x20); KPrintf(" x20: 0x%016lx\n", tf->x20);
KPrintf(" x21: 0x%x\n", tf->x21); KPrintf(" x21: 0x%016lx\n", tf->x21);
KPrintf(" x22: 0x%x\n", tf->x22); KPrintf(" x22: 0x%016lx\n", tf->x22);
KPrintf(" x23: 0x%x\n", tf->x23); KPrintf(" x23: 0x%016lx\n", tf->x23);
KPrintf(" x24: 0x%x\n", tf->x24); KPrintf(" x24: 0x%016lx\n", tf->x24);
KPrintf(" x25: 0x%x\n", tf->x25); KPrintf(" x25: 0x%016lx\n", tf->x25);
KPrintf(" x26: 0x%x\n", tf->x26); KPrintf(" x26: 0x%016lx\n", tf->x26);
KPrintf(" x27: 0x%x\n", tf->x27); KPrintf(" x27: 0x%016lx\n", tf->x27);
KPrintf(" x28: 0x%x\n", tf->x28); KPrintf(" x28: 0x%016lx\n", tf->x28);
KPrintf(" x29: 0x%x\n", tf->x29); KPrintf(" x29: 0x%016lx\n", tf->x29);
KPrintf(" x30: 0x%x\n", tf->x30); KPrintf(" x30: 0x%016lx\n", tf->x30);
} }
void dabort_reason(struct trapframe* r) void dabort_reason(struct trapframe* r)
@ -91,8 +93,9 @@ void dabort_reason(struct trapframe* r)
uint32_t fault_status, fault_address; uint32_t fault_status, fault_address;
__asm__ __volatile__("mrs %0, esr_el1" : "=r"(fault_status)); __asm__ __volatile__("mrs %0, esr_el1" : "=r"(fault_status));
__asm__ __volatile__("mrs %0, far_el1" : "=r"(fault_address)); __asm__ __volatile__("mrs %0, far_el1" : "=r"(fault_address));
LOG("program counter: 0x%x caused\n", r->pc); w_esr_el1(0);
LOG("data abort at 0x%x, status 0x%x\n", fault_address, fault_status); LOG("program counter: 0x%016lx caused\n", r->pc);
LOG("data abort at 0x%016lx, status 0x%016lx\n", fault_address, fault_status);
if ((fault_status & 0x3f) == 0x21) // Alignment failure if ((fault_status & 0x3f) == 0x21) // Alignment failure
KPrintf("reason: alignment\n"); KPrintf("reason: alignment\n");
else if ((fault_status & 0x3f) == 0x4) // Translation fault, level 0 else if ((fault_status & 0x3f) == 0x4) // Translation fault, level 0
@ -131,8 +134,9 @@ void iabort_reason(struct trapframe* r)
uint32_t fault_status, fault_address; uint32_t fault_status, fault_address;
__asm__ __volatile__("mrs %0, esr_el1" : "=r"(fault_status)); __asm__ __volatile__("mrs %0, esr_el1" : "=r"(fault_status));
__asm__ __volatile__("mrs %0, far_el1" : "=r"(fault_address)); __asm__ __volatile__("mrs %0, far_el1" : "=r"(fault_address));
LOG("program counter: 0x%x caused\n", r->pc); LOG("program counter: 0x%016lx caused\n", r->pc);
LOG("data abort at 0x%x, status 0x%x\n", fault_address, fault_status); LOG("data abort at 0x%016lx, status 0x%016lx\n", fault_address, fault_status);
w_esr_el1(0);
if ((fault_status & 0x3f) == 0x21) // Alignment failure if ((fault_status & 0x3f) == 0x21) // Alignment failure
KPrintf("reason: alignment\n"); KPrintf("reason: alignment\n");
else if ((fault_status & 0x3f) == 0x4) // Translation fault, level 0 else if ((fault_status & 0x3f) == 0x4) // Translation fault, level 0

View File

@ -30,8 +30,8 @@ Modification:
// clang-format off // clang-format off
// interrupt controller GICv3 // interrupt controller GICv3
#define GICV3 MMIO_P2V_WO(0x08000000ULL) #define GICV3 MMIO_P2V_WO(0xFD400000ULL)
#define GICV3_REDIST MMIO_P2V_WO(0x080a0000ULL) #define GICV3_REDIST MMIO_P2V_WO(0xFD460000ULL)
#define D_CTLR 0x0 #define D_CTLR 0x0
#define D_TYPER 0x4 #define D_TYPER 0x4

View File

@ -55,62 +55,56 @@ Modification:
#define UNLOCKED 0xFF #define UNLOCKED 0xFF
// int spinlock_lock(spinlock_t * lock, uint64_t timeout) // int spinlock_lock(spinlock_t * lock, uint64_t timeout)
.global _spinlock_lock .global _spinlock_lock
.func _spinlock_lock .func _spinlock_lock
_spinlock_lock: _spinlock_lock:
mov w2, #1 mov w2, #1
sevl
1:
wfe
sevl 2:
wfe ldaxrb w1, [x0] // check if the spinlock is currently unlocked
cmp w1, #UNLOCKED
bne 1b
ldaxrb w1, [x0] // check if the spinlock is currently unlocked mrs x1, mpidr_el1 // get our CPU ID
cmp w1, #UNLOCKED and x1, x1, #0xFFF
bne _spinlock_lock lsr x1, x1, #8
stxrb w2, w1, [x0]
cmp x2, #0
bne 2b // check if the write was successful, if the write failed, start over
mrs x1, mpidr_el1 // get our CPU ID dmb ish // Ensure that accesses to shared resource have completed
and x1, x1, #3
stxrb w2, w1, [x0]
cmp x2, #0
bne _spinlock_lock // check if the write was successful, if the write failed, start over
dmb ish // Ensure that accesses to shared resource have completed mov x0, #0
ret
mov x0, #0 .endfunc
ret
.endfunc
// void spinlock_unlock(spinlock_t * lock) // void spinlock_unlock(spinlock_t * lock)
.global _spinlock_unlock .global _spinlock_unlock
.func _spinlock_unlock .func _spinlock_unlock
_spinlock_unlock: _spinlock_unlock:
mrs x1, mpidr_el1 // get our CPU ID
and x1, x1, #0xFFF
lsr x1, x1, #8
mrs x1, mpidr_el1 // get our CPU ID ldr w2, [x0]
and x1, x1, #3 cmp w1, w2
bne 1f //doesn't match,jump to 1
ldr w2, [x0] dmb ish
cmp w1, w2 mov w1, #UNLOCKED
bne 1f //doesn't match,jump to 1 str w1, [x0]
dsb ish //Ensure that no instructions following the barrier execute until
// all memory accesses prior to the barrier have completed.
dmb ish sevl // send event to wake up other cores waiting on spinlock
mov w1, #UNLOCKED
str w1, [x0]
dsb ish //Ensure that no instructions following the barrier execute until
// all memory accesses prior to the barrier have completed.
sevl // send event to wake up other cores waiting on spinlock
mov x0, #0 // return success
ret
mov x0, #0 // return success
ret
1: 1:
mov x0, #1 //doesn't match, so exit with failure mov x0, #1 //doesn't match, so exit with failure
ret ret
.endfunc .endfunc
.end .end

View File

@ -143,13 +143,13 @@ Modification:
.balign 0x800 .balign 0x800
alltraps: alltraps:
// Current EL with sp0 // Current EL with sp0
b . b badtrap
.balign 0x80 .balign 0x80
b . b badtrap
.balign 0x80 .balign 0x80
b . b badtrap
.balign 0x80 .balign 0x80
b . b badtrap
// Current EL with spx // Current EL with spx
.balign 0x80 .balign 0x80
@ -157,9 +157,9 @@ alltraps:
.balign 0x80 .balign 0x80
b el1irq b el1irq
.balign 0x80 .balign 0x80
b . b badtrap
.balign 0x80 .balign 0x80
b . b badtrap
// Lower EL using aarch64 // Lower EL using aarch64
.balign 0x80 .balign 0x80
@ -167,32 +167,34 @@ alltraps:
.balign 0x80 .balign 0x80
b el0irq b el0irq
.balign 0x80 .balign 0x80
b . b badtrap
.balign 0x80 .balign 0x80
b . b badtrap
// Lower EL using aarch32 // Lower EL using aarch32
.balign 0x80 .balign 0x80
b . b badtrap
.balign 0x80 .balign 0x80
b . b badtrap
.balign 0x80 .balign 0x80
b . b badtrap
.balign 0x80 .balign 0x80
b . b badtrap
badtrap:
savereg
mov x0, sp
bl kernel_intr_handler
b .
el1sync: el1sync:
msr daifset, #0xf
savereg savereg
mov x0, sp mov x0, sp
bl kernel_abort_handler bl kernel_abort_handler
b . b .
el1irq: el1irq:
msr daifset, #0xf
usavereg usavereg
mov x0, sp mov x0, sp
bl intr_irq_dispatch bl intr_irq_dispatch
@ -201,9 +203,7 @@ el1irq:
eret eret
el0sync: el0sync:
msr daifset, #0xf
usavereg usavereg
mov x0, sp mov x0, sp
bl syscall_arch_handler bl syscall_arch_handler
@ -212,9 +212,7 @@ el0sync:
eret eret
el0irq: el0irq:
msr daifset, #0xf
usavereg usavereg
mov x0, sp mov x0, sp
bl intr_irq_dispatch bl intr_irq_dispatch

View File

@ -59,7 +59,7 @@ __attribute__((optimize("O0"))) void spinlock_init(struct spinlock* lock, char*
} }
extern int _spinlock_lock(struct spinlock* lock, uint32_t timeout); extern int _spinlock_lock(struct spinlock* lock, uint32_t timeout);
extern void _spinlock_unlock(struct spinlock* lock); extern int _spinlock_unlock(struct spinlock* lock);
__attribute__((optimize("O0"))) void spinlock_lock(struct spinlock* lock) __attribute__((optimize("O0"))) void spinlock_lock(struct spinlock* lock)
{ {
@ -88,7 +88,9 @@ __attribute__((optimize("O0"))) void spinlock_unlock(struct spinlock* lock)
_double_list_del(p_lock_node->prev, p_lock_node->next); _double_list_del(p_lock_node->prev, p_lock_node->next);
_spinlock_unlock(&request_lock); _spinlock_unlock(&request_lock);
_spinlock_unlock(lock); if (_spinlock_unlock(lock) != 0) {
ERROR("Core %d trying to unlock a lock belongs to %d.\n", cur_cpuid(), lock->owner_cpu);
}
} }
__attribute__((optimize("O0"))) bool spinlock_try_lock(struct spinlock* lock) __attribute__((optimize("O0"))) bool spinlock_try_lock(struct spinlock* lock)

View File

@ -1,4 +1,4 @@
ifneq ($(findstring $(BOARD), ok1028a-c), ) ifneq ($(findstring $(BOARD), 3568), )
SRC_DIR := armv8-a SRC_DIR := armv8-a
endif endif
ifneq ($(findstring $(BOARD), imx6q-sabrelite zynq7000-zc702), ) ifneq ($(findstring $(BOARD), imx6q-sabrelite zynq7000-zc702), )

View File

@ -48,7 +48,7 @@ uint32_t boot_pgdir[NR_PDE_ENTRIES] __attribute__((aligned(0x4000))) = { 0 };
static void build_boot_pgdir() static void build_boot_pgdir()
{ {
// dev mem // dev mem
uint32_t dev_mem_end_idx = (DEV_PHYMEM_BASE + DEV_MEM_SZ) >> LEVEL3_PDE_SHIFT; uint32_t dev_mem_end_idx = (DEV_PHYMEM_BASE + DEV_MEM_SIZE) >> LEVEL3_PDE_SHIFT;
for (uint32_t i = DEV_PHYMEM_BASE >> LEVEL3_PDE_SHIFT; i < dev_mem_end_idx; i++) { for (uint32_t i = DEV_PHYMEM_BASE >> LEVEL3_PDE_SHIFT; i < dev_mem_end_idx; i++) {
boot_pgdir[i] = (i << LEVEL3_PDE_SHIFT) | L1_TYPE_SEC | L1_SECT_DEV | L1_SECT_AP0; boot_pgdir[i] = (i << LEVEL3_PDE_SHIFT) | L1_TYPE_SEC | L1_SECT_DEV | L1_SECT_AP0;
boot_pgdir[MMIO_P2V_WO(i << LEVEL3_PDE_SHIFT) >> LEVEL3_PDE_SHIFT] = (i << LEVEL3_PDE_SHIFT) | L1_TYPE_SEC | L1_SECT_DEV | L1_SECT_AP0; boot_pgdir[MMIO_P2V_WO(i << LEVEL3_PDE_SHIFT) >> LEVEL3_PDE_SHIFT] = (i << LEVEL3_PDE_SHIFT) | L1_TYPE_SEC | L1_SECT_DEV | L1_SECT_AP0;

View File

@ -67,7 +67,7 @@ Modification:
/* Deivce memory layout */ /* Deivce memory layout */
#define DEV_PHYMEM_BASE (0x00000000) #define DEV_PHYMEM_BASE (0x00000000)
#define DEV_VRTMEM_BASE (0x80000000) #define DEV_VRTMEM_BASE (0x80000000)
#define DEV_MEM_SZ (0x10000000) #define DEV_MEM_SIZE (0x10000000)
/* Kernel memory layout */ /* Kernel memory layout */
#define KERN_MEM_BASE (0x90000000) // First kernel virtual address #define KERN_MEM_BASE (0x90000000) // First kernel virtual address

View File

@ -66,7 +66,7 @@ Modification:
/* Deivce memory layout */ /* Deivce memory layout */
#define DEV_PHYMEM_BASE (0xE0000000) #define DEV_PHYMEM_BASE (0xE0000000)
#define DEV_VRTMEM_BASE (0x80000000) #define DEV_VRTMEM_BASE (0x80000000)
#define DEV_MEM_SZ (0x1FFFFFFF) #define DEV_MEM_SIZE (0x1FFFFFFF)
/* Kernel memory layout */ /* Kernel memory layout */
#define KERN_MEM_BASE (0xA0000000) // First kernel virtual address #define KERN_MEM_BASE (0xA0000000) // First kernel virtual address

View File

@ -1,3 +1,3 @@
SRC_DIR := cortex-a72 SRC_DIR := cortex-a55
include $(KERNEL_ROOT)/compiler.mk include $(KERNEL_ROOT)/compiler.mk

View File

@ -33,11 +33,11 @@ Modification:
#define ARCH_BIT 64 #define ARCH_BIT 64
/* A72 physical memory layout */ /* A55 physical memory layout */
#define PHY_MEM_BASE (0x0000000040000000ULL) #define PHY_MEM_BASE (0x0000000010000000ULL)
#define PHY_USER_FREEMEM_BASE (0x0000000046000000ULL) #define PHY_USER_FREEMEM_BASE (0x0000000040000000ULL)
#define PHY_USER_FREEMEM_TOP (0x0000000048000000ULL) #define PHY_USER_FREEMEM_TOP (0x00000000E0000000ULL)
#define PHY_MEM_STOP (0x0000000048000000ULL) #define PHY_MEM_STOP (0x00000000E0000000ULL)
/* PTE-PAGE_SIZE */ /* PTE-PAGE_SIZE */
#define LEVEL4_PTE_SHIFT 12 #define LEVEL4_PTE_SHIFT 12
@ -58,23 +58,23 @@ Modification:
#define NUM_TOPLEVEL_PDE NUM_LEVEL2_PDE #define NUM_TOPLEVEL_PDE NUM_LEVEL2_PDE
#define PAGE_SIZE LEVEL4_PTE_SIZE #define PAGE_SIZE LEVEL4_PTE_SIZE
#define MAX_NR_FREE_PAGES ((PHY_MEM_STOP - PHY_MEM_BASE) >> LEVEL4_PTE_SHIFT) #define MAX_NR_FREE_PAGES ((PHY_USER_FREEMEM_BASE - PHY_MEM_BASE) >> LEVEL4_PTE_SHIFT)
/* Deivce memory layout */ /* Deivce memory layout */
#define DEV_PHYMEM_BASE (0x0000000000000000ULL) #define DEV_PHYMEM_BASE (0x00000000F0000000ULL)
#define DEV_VRTMEM_BASE (0x0000004000000000ULL) #define DEV_VRTMEM_BASE (0x00000040F0000000ULL)
#define DEV_MEM_SZ (0x0000000010000000ULL) #define DEV_MEM_SIZE (0x0000000010000000ULL)
/* User memory layout */ /* User memory layout */
#define USER_STACK_SIZE PAGE_SIZE #define USER_STACK_SIZE PAGE_SIZE
#define USER_MEM_BASE (0x0000000000000000ULL) #define USER_MEM_BASE (0x0000000000000000ULL)
#define USER_MEM_TOP DEV_VRTMEM_BASE #define USER_MEM_TOP (0x0000004000000000ULL)
#define USER_IPC_SPACE_BASE (0x0000003000000000ULL) #define USER_IPC_SPACE_BASE (0x0000003000000000ULL)
#define USER_IPC_USE_ALLOCATOR_WATERMARK (0x0000003000010000ULL) #define USER_IPC_USE_ALLOCATOR_WATERMARK (0x0000003000010000ULL)
#define USER_IPC_SPACE_TOP (USER_IPC_SPACE_BASE + 0x10000000ULL) #define USER_IPC_SPACE_TOP (USER_IPC_SPACE_BASE + 0x10000000ULL)
/* Kernel memory layout */ /* Kernel memory layout */
#define KERN_MEM_BASE (0x0000006040000000ULL) // First kernel virtual address #define KERN_MEM_BASE (0x0000006010000000ULL) // First kernel virtual address
#define KERN_OFFSET (KERN_MEM_BASE - PHY_MEM_BASE) #define KERN_OFFSET (KERN_MEM_BASE - PHY_MEM_BASE)
#define V2P(a) (((uint64_t)(a)) - KERN_OFFSET) #define V2P(a) (((uint64_t)(a)) - KERN_OFFSET)

View File

@ -51,9 +51,9 @@ extern uint64_t kernel_data_begin[];
#define L4_PTE_NORMAL ((0b01) << 2) // Device memory #define L4_PTE_NORMAL ((0b01) << 2) // Device memory
#define L4_PTE_AF (1 << 10) // Data Access Permissions #define L4_PTE_AF (1 << 10) // Data Access Permissions
#define L4_PTE_PXN (1UL << 53) // Privileged eXecute Never #define L4_PTE_PXN (1UL << 53) // Privileged eXecute Never
#define L4_PTE_UXN (1UL << 54) // Unprivileged(user) eXecute Never #define L4_PTE_UXN (1UL << 54) // Unprivileged(user) eXecute Never
#define L4_PTE_XN (PTE_PXN|PTE_UXN) // eXecute Never #define L4_PTE_XN (PTE_PXN|PTE_UXN) // eXecute Never
#define IDX_MASK (0b111111111) #define IDX_MASK (0b111111111)
#define L3_PDE_INDEX(idx) ((idx << LEVEL3_PDE_SHIFT) & L3_IDX_MASK) #define L3_PDE_INDEX(idx) ((idx << LEVEL3_PDE_SHIFT) & L3_IDX_MASK)
@ -62,64 +62,69 @@ extern uint64_t kernel_data_begin[];
uint64_t boot_l2pgdir[NUM_LEVEL2_PDE] __attribute__((aligned(0x1000))) = { 0 }; uint64_t boot_l2pgdir[NUM_LEVEL2_PDE] __attribute__((aligned(0x1000))) = { 0 };
uint64_t boot_dev_l3pgdir[NUM_LEVEL3_PDE] __attribute__((aligned(0x1000))) = { 0 }; uint64_t boot_dev_l3pgdir[NUM_LEVEL3_PDE] __attribute__((aligned(0x1000))) = { 0 };
uint64_t boot_virt_dev_l3pgdir[NUM_LEVEL3_PDE] __attribute__((aligned(0x1000))) = { 0 };
uint64_t boot_kern_l3pgdir[NUM_LEVEL3_PDE] __attribute__((aligned(0x1000))) = { 0 }; uint64_t boot_kern_l3pgdir[NUM_LEVEL3_PDE] __attribute__((aligned(0x1000))) = { 0 };
uint64_t boot_virt_kern_l3pgdir[NUM_LEVEL3_PDE] __attribute__((aligned(0x1000))) = { 0 };
uint64_t boot_dev_l4pgdirs[NUM_LEVEL3_PDE][NUM_LEVEL4_PTE] __attribute__((aligned(0x1000))) = { 0 }; uint64_t boot_dev_l4pgdirs[NUM_LEVEL3_PDE][NUM_LEVEL4_PTE] __attribute__((aligned(0x1000))) = { 0 };
uint64_t boot_kern_l4pgdirs[NUM_LEVEL3_PDE][NUM_LEVEL4_PTE] __attribute__((aligned(0x1000))) = { 0 }; uint64_t boot_kern_l4pgdirs[NUM_LEVEL3_PDE][NUM_LEVEL4_PTE] __attribute__((aligned(0x1000))) = { 0 };
static void build_boot_pgdir() static void build_boot_pgdir()
{ {
uint64_t dev_phy_mem_base = DEV_PHYMEM_BASE; static bool built = false;
// dev mem if (!built) {
boot_l2pgdir[(dev_phy_mem_base >> LEVEL2_PDE_SHIFT) & IDX_MASK] = (uint64_t)boot_dev_l3pgdir | L2_TYPE_TAB | L2_PTE_VALID; uint64_t dev_phy_mem_base = DEV_PHYMEM_BASE;
boot_l2pgdir[(MMIO_P2V_WO(dev_phy_mem_base) >> LEVEL2_PDE_SHIFT) & IDX_MASK] = (uint64_t)boot_dev_l3pgdir | L2_TYPE_TAB | L2_PTE_VALID;
uint64_t cur_mem_paddr = ALIGNDOWN((uint64_t)DEV_PHYMEM_BASE, PAGE_SIZE); // dev mem
for (size_t i = 0; i < NUM_LEVEL3_PDE; i++) { boot_l2pgdir[(dev_phy_mem_base >> LEVEL2_PDE_SHIFT) & IDX_MASK] = (uint64_t)boot_dev_l3pgdir | L2_TYPE_TAB | L2_PTE_VALID;
boot_dev_l3pgdir[i] = (uint64_t)boot_dev_l4pgdirs[i] | L3_TYPE_TAB | L3_PTE_VALID; boot_l2pgdir[(MMIO_P2V_WO(dev_phy_mem_base) >> LEVEL2_PDE_SHIFT) & IDX_MASK] = (uint64_t)boot_dev_l3pgdir | L2_TYPE_TAB | L2_PTE_VALID;
for (size_t j = 0; j < NUM_LEVEL4_PTE; j++) { uint64_t cur_mem_paddr = ALIGNDOWN((uint64_t)DEV_PHYMEM_BASE, LEVEL2_PDE_SIZE);
boot_dev_l4pgdirs[i][j] = cur_mem_paddr | L4_TYPE_PAGE | L4_PTE_DEV | L4_PTE_AF | L4_PTE_XN; for (size_t i = 0; i < NUM_LEVEL3_PDE; i++) {
boot_dev_l3pgdir[i] = (uint64_t)boot_dev_l4pgdirs[i] | L3_TYPE_TAB | L3_PTE_VALID;
cur_mem_paddr += PAGE_SIZE; for (size_t j = 0; j < NUM_LEVEL4_PTE; j++) {
boot_dev_l4pgdirs[i][j] = cur_mem_paddr | L4_TYPE_PAGE | L4_PTE_DEV | L4_PTE_AF | L4_PTE_XN;
if (cur_mem_paddr >= DEV_PHYMEM_BASE && cur_mem_paddr < DEV_PHYMEM_BASE + DEV_MEM_SIZE) {
boot_dev_l4pgdirs[i][j] = cur_mem_paddr | 0x403;
} else {
boot_dev_l4pgdirs[i][j] = cur_mem_paddr | 0x403;
}
cur_mem_paddr += PAGE_SIZE;
}
} }
}
// identical mem // identical mem
boot_l2pgdir[(PHY_MEM_BASE >> LEVEL2_PDE_SHIFT) & IDX_MASK] = (uint64_t)boot_kern_l3pgdir | L2_TYPE_TAB | L2_PTE_VALID; boot_l2pgdir[(PHY_MEM_BASE >> LEVEL2_PDE_SHIFT) & IDX_MASK] = (uint64_t)boot_kern_l3pgdir | L2_TYPE_TAB | L2_PTE_VALID;
boot_l2pgdir[(P2V_WO(PHY_MEM_BASE) >> LEVEL2_PDE_SHIFT) & IDX_MASK] = (uint64_t)boot_kern_l3pgdir | L2_TYPE_TAB | L2_PTE_VALID; boot_l2pgdir[(P2V_WO(PHY_MEM_BASE) >> LEVEL2_PDE_SHIFT) & IDX_MASK] = (uint64_t)boot_kern_l3pgdir | L2_TYPE_TAB | L2_PTE_VALID;
cur_mem_paddr = ALIGNDOWN((uint64_t)PHY_MEM_BASE, PAGE_SIZE); cur_mem_paddr = ALIGNDOWN((uint64_t)0x00000000ULL, PAGE_SIZE);
for (size_t i = 0; i < NUM_LEVEL3_PDE; i++) { for (size_t i = 0; i < NUM_LEVEL3_PDE; i++) {
boot_kern_l3pgdir[i] = (uint64_t)boot_kern_l4pgdirs[i] | L3_TYPE_TAB | L3_PTE_VALID; boot_kern_l3pgdir[i] = (uint64_t)boot_kern_l4pgdirs[i] | L3_TYPE_TAB | L3_PTE_VALID;
for (size_t j = 0; j < NUM_LEVEL4_PTE; j++) { for (size_t j = 0; j < NUM_LEVEL4_PTE; j++) {
boot_kern_l4pgdirs[i][j] = cur_mem_paddr | L4_TYPE_PAGE | L4_PTE_NORMAL | L4_PTE_AF; boot_kern_l4pgdirs[i][j] = cur_mem_paddr | 0x713;
cur_mem_paddr += PAGE_SIZE; cur_mem_paddr += PAGE_SIZE;
}
} }
built = true;
} }
} }
static void load_boot_pgdir() static void load_boot_pgdir()
{ {
uint64_t val;
TTBR0_W((uintptr_t)boot_l2pgdir); TTBR0_W((uintptr_t)boot_l2pgdir);
TTBR1_W(0); TTBR1_W(0);
TCR_W(TCR_VALUE); #define TCR_TRUE_VALUE (0x0000000080813519ULL)
MAIR_W((MT_DEVICE_nGnRnE << (8 * AI_DEVICE_nGnRnE_IDX)) | (MT_NORMAL_NC << (8 * AI_NORMAL_NC_IDX))); uint64_t tcr = 0;
TCR_R(tcr);
tcr &= (uint64_t)~0xFF;
tcr |= 0x19;
TCR_W(tcr);
// Enable paging using read/modify/write
SCTLR_R(val);
val |= (1 << 0); // EL1 and EL0 stage 1 address translation enabled.
SCTLR_W(val);
// flush all TLB
DSB();
CLEARTLB(0); CLEARTLB(0);
ISB(); ISB();
} }
@ -130,7 +135,7 @@ void bootmain()
{ {
build_boot_pgdir(); build_boot_pgdir();
load_boot_pgdir(); load_boot_pgdir();
__asm__ __volatile__("add sp, sp, %0" ::"r"(KERN_MEM_BASE - PHY_MEM_BASE)); __asm__ __volatile__("add sp, sp, %0" ::"r"(KERN_OFFSET));
if (!_bss_inited) { if (!_bss_inited) {
memset(&kernel_data_begin, 0x00, (size_t)((uint64_t)kernel_data_end - (uint64_t)kernel_data_begin)); memset(&kernel_data_begin, 0x00, (size_t)((uint64_t)kernel_data_end - (uint64_t)kernel_data_begin));
_bss_inited = true; _bss_inited = true;

View File

@ -61,35 +61,36 @@ void GetPdeAttr(uintptr_t* attr);
/* /*
Enable MMU, cache, write buffer, etc. Enable MMU, cache, write buffer, etc.
*/ */
#define SCTLR_R(val) __asm__ volatile("mrs %0, sctlr_el1" : "=r"(val)) #define SCTLR_R(val) __asm__ volatile("mrs %0, sctlr_el1" : "=r"(val)::"memory")
#define SCTLR_W(val) __asm__ volatile("msr sctlr_el1, %0" ::"r"(val)) #define SCTLR_W(val) __asm__ volatile("msr sctlr_el1, %0" ::"r"(val) : "memory")
/* /*
Read and write mmu pagetable register base addr Read and write mmu pagetable register base addr
*/ */
#define TTBR0_R(val) __asm__ volatile("mrs %0, ttbr0_el1" : "=r"(val)) #define TTBR0_R(val) __asm__ volatile("mrs %0, ttbr0_el1" : "=r"(val)::"memory")
#define TTBR0_W(val) __asm__ volatile("msr ttbr0_el1, %0" ::"r"(val)) #define TTBR0_W(val) __asm__ volatile("msr ttbr0_el1, %0" ::"r"(val) : "memory")
/* /*
Read and write mmu pagetable register base addr Read and write mmu pagetable register base addr
*/ */
#define TTBR1_R(val) __asm__ volatile("mrs %0, ttbr1_el1" : "=r"(val)) #define TTBR1_R(val) __asm__ volatile("mrs %0, ttbr1_el1" : "=r"(val)::"memory")
#define TTBR1_W(val) __asm__ volatile("msr ttbr1_el1, %0" ::"r"(val)) #define TTBR1_W(val) __asm__ volatile("msr ttbr1_el1, %0" ::"r"(val) : "memory")
/* /*
Translation Control RegisterTCR Translation Control RegisterTCR
*/ */
#define TCR_R(val) __asm__ volatile("mrs %0, tcr_el1" : "=r"(val)) #define TCR_R(val) __asm__ volatile("mrs %0, tcr_el1" : "=r"(val)::"memory")
#define TCR_W(val) __asm__ volatile("msr tcr_el1, %0" ::"r"(val)) #define TCR_W(val) __asm__ volatile("msr tcr_el1, %0" ::"r"(val) : "memory")
#define MAIR_R(val) __asm__ volatile("mrs %0, mair_el1" : "=r"(val)) #define MAIR_R(val) __asm__ volatile("mrs %0, mair_el1" : "=r"(val)::"memory")
#define MAIR_W(val) __asm__ volatile("msr mair_el1, %0" ::"r"(val)) #define MAIR_W(val) __asm__ volatile("msr mair_el1, %0" ::"r"(val) : "memory")
/* /*
Flush TLB when loading a new page table. Flush TLB when loading a new page table.
@note If nG is not set in the pte attribute, process switching need flush tlb. @note If nG is not set in the pte attribute, process switching need flush tlb.
*/ */
#define CLEARTLB(val) __asm__ volatile("tlbi vmalle1") // #define CLEARTLB(val) __asm__ volatile("tlbi vmalle1" ::: "memory")
#define CLEARTLB(val) __asm__ volatile("tlbi vmalle1is" ::: "memory")
/* /*
When nG is set in the pte attribute, the process is assigned an ASID, which is stored in the lower 8 bits of the CONTEXTIDR register. When nG is set in the pte attribute, the process is assigned an ASID, which is stored in the lower 8 bits of the CONTEXTIDR register.

View File

@ -45,7 +45,9 @@ void load_pgdir(uintptr_t pgdir_paddr)
struct DCacheDone* p_dcache_done = AchieveResource(&right_group.dcache_driver_tag); struct DCacheDone* p_dcache_done = AchieveResource(&right_group.dcache_driver_tag);
TTBR0_W((uint64_t)pgdir_paddr); TTBR0_W((uint64_t)pgdir_paddr);
DSB();
CLEARTLB(0); CLEARTLB(0);
ISB();
p_icache_done->invalidateall(); p_icache_done->invalidateall();
p_dcache_done->flushall(); p_dcache_done->flushall();
} }

View File

@ -52,22 +52,26 @@ Modification:
void GetUsrPteAttr(uintptr_t* attr) void GetUsrPteAttr(uintptr_t* attr)
{ {
*attr = ARMV8_PTE_AP_U | ARMV8_PTE_AP_RW | ARMV8_PTE_AF | ARMV8_PTE_NORMAL | ARMV8_PTE_VALID; // *attr = ARMV8_PTE_AP_U | ARMV8_PTE_AP_RW | ARMV8_PTE_AF | ARMV8_PTE_NORMAL | ARMV8_PTE_VALID;
*attr = 0x713 | ARMV8_PTE_AP_U;
} }
void GetUsrDevPteAttr(uintptr_t* attr) void GetUsrDevPteAttr(uintptr_t* attr)
{ {
*attr = ARMV8_PTE_AP_U | ARMV8_PTE_AP_RW | ARMV8_PTE_AF | ARMV8_PTE_DEVICE | ARMV8_PTE_XN | ARMV8_PTE_VALID; // *attr = ARMV8_PTE_AP_U | ARMV8_PTE_AP_RW | ARMV8_PTE_AF | ARMV8_PTE_DEVICE | ARMV8_PTE_XN | ARMV8_PTE_VALID;
*attr = 0x403 | ARMV8_PTE_AP_U;
} }
void GetDevPteAttr(uintptr_t* attr) void GetDevPteAttr(uintptr_t* attr)
{ {
*attr = ARMV8_PTE_AP_K | ARMV8_PTE_AP_RW | ARMV8_PTE_AF | ARMV8_PTE_DEVICE | ARMV8_PTE_XN | ARMV8_PTE_VALID; // *attr = ARMV8_PTE_AP_K | ARMV8_PTE_AP_RW | ARMV8_PTE_AF | ARMV8_PTE_DEVICE | ARMV8_PTE_XN | ARMV8_PTE_VALID;
*attr = 0x403ULL;
} }
void GetKernPteAttr(uintptr_t* attr) void GetKernPteAttr(uintptr_t* attr)
{ {
*attr = ARMV8_PTE_AP_K | ARMV8_PTE_AP_RW | ARMV8_PTE_AF | ARMV8_PTE_NORMAL | ARMV8_PTE_VALID; // *attr = ARMV8_PTE_AP_K | ARMV8_PTE_AP_RW | ARMV8_PTE_AF | ARMV8_PTE_NORMAL | ARMV8_PTE_VALID;
*attr = 0x713ULL;
} }
void GetPdeAttr(uintptr_t* attr) void GetPdeAttr(uintptr_t* attr)

View File

@ -1,5 +1,5 @@
# The following three platforms support compatiable instructions. # The following three platforms support compatiable instructions.
ifneq ($(findstring $(BOARD), ok1028a-c), ) ifneq ($(findstring $(BOARD), 3568), )
SRC_DIR := armv8-a SRC_DIR := armv8-a
endif endif
ifneq ($(findstring $(BOARD), imx6q-sabrelite zynq7000-zc702), ) ifneq ($(findstring $(BOARD), imx6q-sabrelite zynq7000-zc702), )

View File

@ -1,4 +1,4 @@
# The following three platforms support compatiable instructions. # The following three platforms support compatiable instructions.
SRC_DIR := cortex-a72 SRC_DIR := cortex-a55
include $(KERNEL_ROOT)/compiler.mk include $(KERNEL_ROOT)/compiler.mk

View File

@ -1,3 +1,3 @@
SRC_FILES := $(wildcard *.c) SRC_FILES := uart.c ns16550.c
include $(KERNEL_ROOT)/compiler.mk include $(KERNEL_ROOT)/compiler.mk

View File

@ -0,0 +1,198 @@
/*
* NS16550 Serial Port
* originally from linux source (arch/powerpc/boot/ns16550.h)
*
* Cleanup and unification
* (C) 2009 by Detlev Zundel, DENX Software Engineering GmbH
*
* modified slightly to
* have addresses as offsets from CONFIG_SYS_ISA_BASE
* added a few more definitions
* added prototypes for ns16550.c
* reduced no of com ports to 2
* modifications (c) Rob Taylor, Flying Pig Systems. 2000.
*
* added support for port on 64-bit bus
* by Richard Danter (richard.danter@windriver.com), (C) 2005 Wind River Systems
*/
/*
* Note that the following macro magic uses the fact that the compiler
* will not allocate storage for arrays of size 0
*/
#include <stdint.h>
/*
* For driver model we always use one byte per register, and sort out the
* differences in the driver
*/
#define CONFIG_SYS_NS16550_REG_SIZE (-1)
#define UART_REG(x) \
unsigned char x; \
unsigned char postpad_##x[-CONFIG_SYS_NS16550_REG_SIZE - 1];
/**
* struct ns16550_platdata - information about a NS16550 port
*
* @base: Base register address
* @reg_shift: Shift size of registers (0=byte, 1=16bit, 2=32bit...)
* @clock: UART base clock speed in Hz
*/
struct ns16550_platdata {
unsigned long base;
int reg_shift;
int clock;
int reg_offset;
uint32_t fcr;
};
struct udevice;
struct NS16550 {
UART_REG(rbr); /* 0 */
UART_REG(ier); /* 1 */
UART_REG(fcr); /* 2 */
UART_REG(lcr); /* 3 */
UART_REG(mcr); /* 4 */
UART_REG(lsr); /* 5 */
UART_REG(msr); /* 6 */
UART_REG(spr); /* 7 */
#ifdef CONFIG_SOC_DA8XX
UART_REG(reg8); /* 8 */
UART_REG(reg9); /* 9 */
UART_REG(revid1); /* A */
UART_REG(revid2); /* B */
UART_REG(pwr_mgmt); /* C */
UART_REG(mdr1); /* D */
#else
UART_REG(mdr1); /* 8 */
UART_REG(reg9); /* 9 */
UART_REG(regA); /* A */
UART_REG(regB); /* B */
UART_REG(regC); /* C */
UART_REG(regD); /* D */
UART_REG(regE); /* E */
UART_REG(uasr); /* F */
UART_REG(scr); /* 10*/
UART_REG(ssr); /* 11*/
#endif
#ifdef CONFIG_DM_SERIAL
struct ns16550_platdata* plat;
#endif
};
#define thr rbr
#define iir fcr
#define dll rbr
#define dlm ier
typedef struct NS16550* NS16550_t;
/*
* These are the definitions for the FIFO Control Register
*/
#define UART_FCR_FIFO_EN 0x01 /* Fifo enable */
#define UART_FCR_CLEAR_RCVR 0x02 /* Clear the RCVR FIFO */
#define UART_FCR_CLEAR_XMIT 0x04 /* Clear the XMIT FIFO */
#define UART_FCR_DMA_SELECT 0x08 /* For DMA applications */
#define UART_FCR_TRIGGER_MASK 0xC0 /* Mask for the FIFO trigger range */
#define UART_FCR_TRIGGER_1 0x00 /* Mask for trigger set at 1 */
#define UART_FCR_TRIGGER_4 0x40 /* Mask for trigger set at 4 */
#define UART_FCR_TRIGGER_8 0x80 /* Mask for trigger set at 8 */
#define UART_FCR_TRIGGER_14 0xC0 /* Mask for trigger set at 14 */
#define UART_FCR_RXSR 0x02 /* Receiver soft reset */
#define UART_FCR_TXSR 0x04 /* Transmitter soft reset */
/* Ingenic JZ47xx specific UART-enable bit. */
#define UART_FCR_UME 0x10
/* Clear & enable FIFOs */
#define UART_FCR_DEFVAL (UART_FCR_FIFO_EN | UART_FCR_RXSR | UART_FCR_TXSR)
/*
* These are the definitions for the Modem Control Register
*/
#define UART_MCR_DTR 0x01 /* DTR */
#define UART_MCR_RTS 0x02 /* RTS */
#define UART_MCR_OUT1 0x04 /* Out 1 */
#define UART_MCR_OUT2 0x08 /* Out 2 */
#define UART_MCR_LOOP 0x10 /* Enable loopback test mode */
#define UART_MCR_AFE 0x20 /* Enable auto-RTS/CTS */
#define UART_MCR_DMA_EN 0x04
#define UART_MCR_TX_DFR 0x08
/*
* These are the definitions for the Line Control Register
*
* Note: if the word length is 5 bits (UART_LCR_WLEN5), then setting
* UART_LCR_STOP will select 1.5 stop bits, not 2 stop bits.
*/
#define UART_LCR_WLS_MSK 0x03 /* character length select mask */
#define UART_LCR_WLS_5 0x00 /* 5 bit character length */
#define UART_LCR_WLS_6 0x01 /* 6 bit character length */
#define UART_LCR_WLS_7 0x02 /* 7 bit character length */
#define UART_LCR_WLS_8 0x03 /* 8 bit character length */
#define UART_LCR_STB 0x04 /* # stop Bits, off=1, on=1.5 or 2) */
#define UART_LCR_PEN 0x08 /* Parity eneble */
#define UART_LCR_EPS 0x10 /* Even Parity Select */
#define UART_LCR_STKP 0x20 /* Stick Parity */
#define UART_LCR_SBRK 0x40 /* Set Break */
#define UART_LCR_BKSE 0x80 /* Bank select enable */
#define UART_LCR_DLAB 0x80 /* Divisor latch access bit */
/*
* These are the definitions for the Line Status Register
*/
#define UART_LSR_DR 0x01 /* Data ready */
#define UART_LSR_OE 0x02 /* Overrun */
#define UART_LSR_PE 0x04 /* Parity error */
#define UART_LSR_FE 0x08 /* Framing error */
#define UART_LSR_BI 0x10 /* Break */
#define UART_LSR_THRE 0x20 /* Xmit holding register empty */
#define UART_LSR_TEMT 0x40 /* Xmitter empty */
#define UART_LSR_ERR 0x80 /* Error */
#define UART_MSR_DCD 0x80 /* Data Carrier Detect */
#define UART_MSR_RI 0x40 /* Ring Indicator */
#define UART_MSR_DSR 0x20 /* Data Set Ready */
#define UART_MSR_CTS 0x10 /* Clear to Send */
#define UART_MSR_DDCD 0x08 /* Delta DCD */
#define UART_MSR_TERI 0x04 /* Trailing edge ring indicator */
#define UART_MSR_DDSR 0x02 /* Delta DSR */
#define UART_MSR_DCTS 0x01 /* Delta CTS */
/*
* These are the definitions for the Interrupt Identification Register
*/
#define UART_IIR_NO_INT 0x01 /* No interrupts pending */
#define UART_IIR_ID 0x06 /* Mask for the interrupt ID */
#define UART_IIR_MSI 0x00 /* Modem status interrupt */
#define UART_IIR_THRI 0x02 /* Transmitter holding register empty */
#define UART_IIR_RDI 0x04 /* Receiver data interrupt */
#define UART_IIR_RLSI 0x06 /* Receiver line status interrupt */
/*
* These are the definitions for the Interrupt Enable Register
*/
#define UART_IER_MSI 0x08 /* Enable Modem status interrupt */
#define UART_IER_RLSI 0x04 /* Enable receiver line status interrupt */
#define UART_IER_THRI 0x02 /* Enable Transmitter holding register int. */
#define UART_IER_RDI 0x01 /* Enable receiver data interrupt */
/* useful defaults for LCR */
#define UART_LCR_8N1 0x03
void NS16550_init(NS16550_t com_port, int baud_divisor);
void NS16550_putc(NS16550_t com_port, char c);
char NS16550_getc(NS16550_t com_port);
int NS16550_tstc(NS16550_t com_port);
void NS16550_reinit(NS16550_t com_port, int baud_divisor);
void _debug_uart_init(void);
void _debug_uart_putc(int ch);
int _debug_uart_getc(void);

View File

@ -0,0 +1,103 @@
/*
* COM1 NS16550 support
* originally from linux source (arch/powerpc/boot/ns16550.c)
* modified to use CONFIG_SYS_ISA_MEM and new defines
*/
#include <stdint.h>
#include "mmio_access.h"
#include "ns16550.h"
#define UART_ADDR MMIO_P2V_WO(0xFE660000)
// #define UART_ADDR (0xFE660000)
#define UART_LCRVAL UART_LCR_8N1 /* 8 data, 1 stop, no parity */
#define UART_MCRVAL (UART_MCR_DTR | UART_MCR_RTS) /* RTS/DTR */
#define out_le32(a, v) (*(volatile uint32_t*)(a) = (v))
#define in_le32(a) (*(volatile uint32_t*)(a))
#ifndef CONFIG_SYS_NS16550_IER
#define CONFIG_SYS_NS16550_IER 0x00
#endif /* CONFIG_SYS_NS16550_IER */
#define serial_dout(reg, value) \
serial_out_shift((char*)com_port + ((char*)reg - (char*)com_port) * (1 << 2), \
2, value)
#define serial_din(reg) \
serial_in_shift((char*)com_port + ((char*)reg - (char*)com_port) * (1 << 2), \
2)
static inline void serial_out_shift(void* addr, int shift, int value)
{
out_le32(addr, value);
}
static inline int serial_in_shift(void* addr, int shift)
{
return in_le32(addr);
}
#ifndef CONFIG_SYS_NS16550_CLK
#define CONFIG_SYS_NS16550_CLK 0
#endif
#define DIV_ROUND_CLOSEST(x, divisor) ( \
{ \
typeof(x) __x = x; \
typeof(divisor) __d = divisor; \
(((typeof(x))-1) > 0 || ((typeof(divisor))-1) > 0 || (__x) > 0) ? (((__x) + ((__d) / 2)) / (__d)) : (((__x) - ((__d) / 2)) / (__d)); \
})
int ns16550_calc_divisor(NS16550_t port, int clock, int baudrate)
{
const unsigned int mode_x_div = 16;
return DIV_ROUND_CLOSEST(clock, mode_x_div * baudrate);
}
void _debug_uart_init(void)
{
struct NS16550* com_port = (struct NS16550*)UART_ADDR;
/*
* We copy the code from above because it is already horribly messy.
* Trying to refactor to nicely remove the duplication doesn't seem
* feasible. The better fix is to move all users of this driver to
* driver model.
*/
int baud_divisor = ns16550_calc_divisor(com_port, 24000000,
1500000);
serial_dout(&com_port->ier, CONFIG_SYS_NS16550_IER);
serial_dout(&com_port->mcr, UART_MCRVAL);
serial_dout(&com_port->fcr, UART_FCR_DEFVAL);
serial_dout(&com_port->lcr, UART_LCR_BKSE | UART_LCRVAL);
serial_dout(&com_port->dll, baud_divisor & 0xff);
serial_dout(&com_port->dlm, (baud_divisor >> 8) & 0xff);
serial_dout(&com_port->lcr, UART_LCRVAL);
}
void _debug_uart_putc(int ch)
{
static struct NS16550* com_port = (struct NS16550*)UART_ADDR;
if (ch == '\n') {
_debug_uart_putc('\r');
}
while (!(serial_din(&com_port->lsr) & UART_LSR_THRE))
;
serial_dout(&com_port->thr, ch);
}
int _debug_uart_getc(void)
{
static struct NS16550* com_port = (struct NS16550*)UART_ADDR;
while (!(serial_din(&com_port->lsr) & UART_LSR_DR))
;
return serial_din(&com_port->rbr);
}

View File

@ -0,0 +1,45 @@
//
// low-level driver routines for pl011 UART.
//
#include "uart.h"
#include "actracer.h"
#include "ns16550.h"
#include "uart_common_ope.h"
// the UART control registers are memory-mapped
// at address UART0. this macro returns the
// address of one of the registers.
void uartinit(void)
{
_debug_uart_init();
}
void uartputc(uint8_t c)
{
_debug_uart_putc((int)c);
}
static uint8_t uartgetc(void)
{
return (uint8_t)_debug_uart_getc();
}
static uint32_t UartGetIrqnum()
{
return 0;
}
static struct XiziSerialDriver hardkernel_serial_driver = {
.sys_serial_init = uartinit,
.get_serial_irqnum = UartGetIrqnum,
.putc = uartputc,
.getc = uartgetc,
};
struct XiziSerialDriver* hardkernel_uart_init(struct TraceTag* hardkernel_tag)
{
hardkernel_serial_driver.sys_serial_init();
return &hardkernel_serial_driver;
}

View File

@ -1,128 +0,0 @@
//
// low-level driver routines for pl011 UART.
//
#include "uart.h"
#include "actracer.h"
#include "uart_common_ope.h"
// the UART control registers are memory-mapped
// at address UART0. this macro returns the
// address of one of the registers.
// the transmit output buffer.
#define UART_TX_BUF_SIZE 32
static char uart_tx_buf[UART_TX_BUF_SIZE];
uint64_t uart_tx_w; // write next to uart_tx_buf[uart_tx_w % UART_TX_BUF_SIZE]
uint64_t uart_tx_r; // read next from uart_tx_buf[uart_tx_r % UART_TX_BUF_SIZE]
void uartinit(void)
{
// disable uart
UART_WRITE_REG(CR, 0);
// disable interrupts.
UART_WRITE_REG(IMSC, 0);
// in qemu, it is not necessary to set baudrate.
// enable FIFOs.
// set word length to 8 bits, no parity.
UART_WRITE_REG(LCRH, LCRH_FEN | LCRH_WLEN_8BIT);
// enable RXE, TXE and enable uart.
UART_WRITE_REG(CR, 0x301);
// enable transmit and receive interrupts.
UART_WRITE_REG(IMSC, INT_RX_ENABLE | INT_TX_ENABLE);
}
// if the UART is idle, and a character is waiting
// in the transmit buffer, send it.
// caller must hold uart_tx_lock.
// called from both the top- and bottom-half.
void uartstart()
{
while (1) {
if (uart_tx_w == uart_tx_r) {
// transmit buffer is empty.
return;
}
if (UART_READ_REG(FR) & FR_TXFF) {
// the UART transmit holding register is full,
// so we cannot give it another byte.
// it will interrupt when it's ready for a new byte.
return;
}
int c = uart_tx_buf[uart_tx_r % UART_TX_BUF_SIZE];
uart_tx_r += 1;
// maybe uartputc() is waiting for space in the buffer.
UART_WRITE_REG(DR, c);
}
}
// add a character to the output buffer and tell the
// UART to start sending if it isn't already.
// blocks if the output buffer is full.
// because it may block, it can't be called
// from interrupts; it's only suitable for use
// by write().
void uartputc(uint8_t c)
{
while (uart_tx_w == uart_tx_r + UART_TX_BUF_SIZE)
;
uart_tx_buf[uart_tx_w % UART_TX_BUF_SIZE] = c;
uart_tx_w += 1;
uartstart();
return;
}
// read one input character from the UART.
// return -1 if none is waiting.
static uint8_t uartgetc(void)
{
if (UART_READ_REG(FR) & FR_RXFE)
return 0xFF;
else
return UART_READ_REG(DR);
}
// handle a uart interrupt, raised because input has
// arrived, or the uart is ready for more output, or
// both. called from trap.c.
void uartintr(void)
{
// read and process incoming characters.
while (1) {
int c = uartgetc();
if (c == 0xFF)
break;
}
// send buffered characters.
uartstart();
// clear transmit and receive interrupts.
UART_WRITE_REG(ICR, INT_RX_ENABLE | INT_TX_ENABLE);
}
static uint32_t UartGetIrqnum()
{
return 0;
}
static struct XiziSerialDriver hardkernel_serial_driver = {
.sys_serial_init = uartinit,
.get_serial_irqnum = UartGetIrqnum,
.putc = uartputc,
.getc = uartgetc,
};
struct XiziSerialDriver* hardkernel_uart_init(struct TraceTag* hardkernel_tag)
{
hardkernel_serial_driver.sys_serial_init();
return &hardkernel_serial_driver;
}

View File

@ -147,7 +147,7 @@ void* AchieveResource(TraceTag* tag)
bool CreateResourceTag(TraceTag* new_tag, TraceTag* owner, char* name, tracemeta_ac_type type, void* p_resource) bool CreateResourceTag(TraceTag* new_tag, TraceTag* owner, char* name, tracemeta_ac_type type, void* p_resource)
{ {
assert(new_tag != NULL && owner != NULL); assert(owner != NULL);
if (owner->meta == NULL) { if (owner->meta == NULL) {
ERROR("Tracer: Empty owner\n"); ERROR("Tracer: Empty owner\n");
return false; return false;
@ -168,7 +168,9 @@ bool CreateResourceTag(TraceTag* new_tag, TraceTag* owner, char* name, tracemeta
doubleListAddOnHead(&new_node->list_node, &owner->meta->children_guard); doubleListAddOnHead(&new_node->list_node, &owner->meta->children_guard);
new_node->parent = owner->meta; new_node->parent = owner->meta;
new_tag->meta = new_node; if (new_tag != NULL) {
new_tag->meta = new_node;
}
return true; return true;
} }
@ -187,12 +189,42 @@ bool DeleteResource(TraceTag* target, TraceTag* owner)
if (target->meta->name != NULL) { if (target->meta->name != NULL) {
slab_free(&sys_tracer.node_name_allocator, target->meta->name); slab_free(&sys_tracer.node_name_allocator, target->meta->name);
} }
// delete all children // delete all children
/// @attention currently donot allow multilevel resource deletion
if (target->meta->type == TRACER_OWNER) { if (target->meta->type == TRACER_OWNER) {
assert(IS_DOUBLE_LIST_EMPTY(&target->meta->children_guard)); while (!IS_DOUBLE_LIST_EMPTY(&target->meta->children_guard)) {
TraceTag tmp_node = {
.meta = DOUBLE_LIST_ENTRY(target->meta->children_guard.next, TracerNode, list_node),
};
DeleteResource(&tmp_node, target);
}
} }
slab_free(&sys_tracer.node_allocator, target->meta); slab_free(&sys_tracer.node_allocator, target->meta);
target->meta = NULL; target->meta = NULL;
return true; return true;
}
void debug_list_tracetree_inner(TracerNode* cur_node)
{
DEBUG("[%s] ", cur_node->name);
TracerNode* tmp = NULL;
DOUBLE_LIST_FOR_EACH_ENTRY(tmp, &cur_node->children_guard, list_node)
{
if (tmp->name != NULL) {
DEBUG("%s ", tmp->name);
} else {
DEBUG("ANON ");
}
}
DEBUG("\n");
DOUBLE_LIST_FOR_EACH_ENTRY(tmp, &cur_node->children_guard, list_node)
{
debug_list_tracetree_inner(tmp);
}
}
void debug_list_tracetree()
{
TracerNode* ref_root = RequireRootTag()->meta;
debug_list_tracetree_inner(ref_root);
} }

View File

@ -38,20 +38,20 @@ KERNELPATHS += \
-I$(KERNEL_ROOT)/hardkernel/cache/L2/pl310/ -I$(KERNEL_ROOT)/hardkernel/cache/L2/pl310/
endif endif
ifeq ($(BOARD), ok1028a-c) ifeq ($(BOARD), 3568)
KERNELPATHS += \ KERNELPATHS += \
-I$(KERNEL_ROOT)/hardkernel/clock/arm/armv8-a/cortex-a72/$(BOARD)/include \ -I$(KERNEL_ROOT)/hardkernel/clock/arm/armv8-a/cortex-a55/$(BOARD)/include \
-I$(KERNEL_ROOT)/hardkernel/arch/arm/armv8-a/cortex-a72/preboot_for_$(BOARD)/include \ -I$(KERNEL_ROOT)/hardkernel/arch/arm/armv8-a/cortex-a55/preboot_for_$(BOARD)/include \
-I$(KERNEL_ROOT)/hardkernel/arch/arm/armv8-a/cortex-a72/ \ -I$(KERNEL_ROOT)/hardkernel/arch/arm/armv8-a/cortex-a55/ \
-I$(KERNEL_ROOT)/hardkernel/mmu/arm/armv8-a/cortex-a72/$(BOARD) \ -I$(KERNEL_ROOT)/hardkernel/mmu/arm/armv8-a/cortex-a55/$(BOARD) \
-I$(KERNEL_ROOT)/hardkernel/mmu/arm/armv8-a/cortex-a72/include \ -I$(KERNEL_ROOT)/hardkernel/mmu/arm/armv8-a/cortex-a55/include \
-I$(KERNEL_ROOT)/hardkernel/clock/arm/armv8-a/cortex-a72/include \ -I$(KERNEL_ROOT)/hardkernel/clock/arm/armv8-a/cortex-a55/include \
-I$(KERNEL_ROOT)/hardkernel/intr/arm/armv8-a/cortex-a72/ \ -I$(KERNEL_ROOT)/hardkernel/intr/arm/armv8-a/cortex-a55/ \
-I$(KERNEL_ROOT)/hardkernel/intr/arm/armv8-a/cortex-a72/$(BOARD) \ -I$(KERNEL_ROOT)/hardkernel/intr/arm/armv8-a/cortex-a55/$(BOARD) \
-I$(KERNEL_ROOT)/hardkernel/intr/arm/armv8-a/cortex-a72/gicv3 \ -I$(KERNEL_ROOT)/hardkernel/intr/arm/armv8-a/cortex-a55/gicv3 \
-I$(KERNEL_ROOT)/hardkernel/uart/arm/armv8-a/cortex-a72/uart_io_for_$(BOARD)/include \ -I$(KERNEL_ROOT)/hardkernel/uart/arm/armv8-a/cortex-a55/uart_io_for_$(BOARD)/include \
-I$(KERNEL_ROOT)/hardkernel/uart/arm/armv8-a/cortex-a72/ \ -I$(KERNEL_ROOT)/hardkernel/uart/arm/armv8-a/cortex-a55/ \
-I$(KERNEL_ROOT)/hardkernel/cache/L1/arm/cortex-a72/ -I$(KERNEL_ROOT)/hardkernel/cache/L1/arm/cortex-a55/
endif endif
KERNELPATHS += \ KERNELPATHS += \

View File

@ -1,4 +1,5 @@
SRC_DIR := fs shell lib boards semaphore drivers tools app
SRC_DIR := fs shell lib boards semaphore drivers tools net app
include $(KERNEL_ROOT)/compiler.mk include $(KERNEL_ROOT)/compiler.mk

View File

@ -10,10 +10,10 @@ cflags = -std=c11 -O2 -march=armv7-a -mtune=cortex-a9 -nostdlib -nodefaultlibs -
board_specs = stub.o board_specs = stub.o
#cflags = -Wall -g -std=c11 #cflags = -Wall -g -std=c11
endif endif
ifeq ($(BOARD), ok1028a-c) ifeq ($(BOARD), 3568)
toolchain ?= aarch64-none-elf- toolchain ?= aarch64-none-elf-
user_ldflags = -N -Ttext 0 user_ldflags = -N -Ttext 0
cflags = -Wall -g -std=c11 -mtune=cortex-a72 -nostdlib -nodefaultlibs -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -ggdb -Wno-unused -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie cflags = -Wall -O2 -std=c11 -mtune=cortex-a55 -nostdlib -nodefaultlibs -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -Wno-unused -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie
board_specs = stub.o board_specs = stub.o
endif endif
@ -28,14 +28,24 @@ INC_DIR = -I$(KERNEL_ROOT)/services/shell/letter-shell \
-I$(KERNEL_ROOT)/services/lib/serial \ -I$(KERNEL_ROOT)/services/lib/serial \
-I$(KERNEL_ROOT)/services/lib/usyscall \ -I$(KERNEL_ROOT)/services/lib/usyscall \
-I$(KERNEL_ROOT)/services/fs/libfs \ -I$(KERNEL_ROOT)/services/fs/libfs \
-I$(KERNEL_ROOT)/services/net/libnet \
-I$(KERNEL_ROOT)/services/net/net_server \
-I$(KERNEL_ROOT)/services/net/net_server/arch \
-I$(KERNEL_ROOT)/services/net/net_server/include \
-I$(KERNEL_ROOT)/services/net/net_server/include/lwip \
-I$(KERNEL_ROOT)/services/net/net_server/include/lwip/apps \
-I$(KERNEL_ROOT)/services/net/net_server/include/lwip/priv \
-I$(KERNEL_ROOT)/services/net/net_server/include/lwip/prot \
-I$(KERNEL_ROOT)/services/net/net_server/include/netif \
-I$(KERNEL_ROOT)/services/net/net_server/include/compat \
-I$(KERNEL_ROOT)/services/semaphore \ -I$(KERNEL_ROOT)/services/semaphore \
-I$(KERNEL_ROOT)/services/boards/$(BOARD) \ -I$(KERNEL_ROOT)/services/boards/$(BOARD) \
-I$(KERNEL_ROOT)/services/app -I$(KERNEL_ROOT)/services/app
ifeq ($(BOARD), imx6q-sabrelite) ifeq ($(BOARD), imx6q-sabrelite)
all: init test_fault simple_client simple_server shell fs_server semaphore_server test_semaphore test_ipc_null test_thread test_irq_hdlr test_irq_block test_irq_send eth_driver epit_server readme.txt | bin all: test_fault simple_client simple_server shell fs_server semaphore_server test_semaphore test_ipc_null test_thread test_irq_hdlr test_irq_block test_irq_send eth_driver epit_server test_net lwip readme.txt | bin
else else
all: init test_fault simple_client simple_server shell fs_server semaphore_server test_ipc_null test_thread test_semaphore readme.txt | bin all: test_fault simple_client simple_server shell fs_server semaphore_server test_ipc_null test_thread test_semaphore test_net lwip readme.txt eth_hal usb_driver_service | bin
endif endif
../tools/mkfs/mkfs ./fs.img $^ ../tools/mkfs/mkfs ./fs.img $^
@mv $(filter-out readme.txt, $^) bin @mv $(filter-out readme.txt, $^) bin
@ -87,10 +97,6 @@ shell: shell_port.o libserial.o printf.o shell_cmd_list.o shell.o shell_ext.o li
@${ld} ${user_ldflags} -e main -o $@ $^ ${board_specs} @${ld} ${user_ldflags} -e main -o $@ $^ ${board_specs}
@${objdump} -S $@ > $@.asm @${objdump} -S $@ > $@.asm
init: init.o libfs.o libipc.o session.o libserial.o printf.o usyscall.o arch_usyscall.o libmem.o
@${ld} ${user_ldflags} -e main -o $@ $^ ${board_specs}
@${objdump} -S $@ > $@.asm
test_fault: test_fault.o libserial.o printf.o usyscall.o arch_usyscall.o test_fault: test_fault.o libserial.o printf.o usyscall.o arch_usyscall.o
@${ld} ${user_ldflags} -e main -o $@ $^ ${board_specs} @${ld} ${user_ldflags} -e main -o $@ $^ ${board_specs}
@${objdump} -S $@ > $@.asm @${objdump} -S $@ > $@.asm
@ -111,8 +117,16 @@ test_priority: test_priority.o libserial.o printf.o usyscall.o arch_usyscall.o l
@${ld} ${user_ldflags} -e main -o $@ $^ ${board_specs} @${ld} ${user_ldflags} -e main -o $@ $^ ${board_specs}
@${objdump} -S $@ > $@.asm @${objdump} -S $@ > $@.asm
test_net: test_net.o lwip_service.o libipc.o session.o libserial.o printf.o usyscall.o arch_usyscall.o libmem.o
@${ld} ${user_ldflags} -e main -o $@ $^ ${board_specs} -llwip -L$(KERNEL_ROOT)/services/net/net_server
@${objdump} -S $@ > $@.asm
%.o: %.c %.o: %.c
@${cc} ${cflags} ${c_useropts} ${INC_DIR} -o $@ -c $< @${cc} ${cflags} ${c_useropts} ${INC_DIR} -o $@ -c $<
%.o: %.S %.o: %.S
@${cc} ${cflags} ${c_useropts} -o $@ -c $< @${cc} ${cflags} ${c_useropts} -o $@ -c $<
eth_hal: test_gmac.o hal_gmac.o hal_gmac_3568.o hal_base.o hal_bsp.o hal_pinctrl_v2.o hal_cru.o hal_gpio.o hal_timer.o hal_cru_rk3568.o system_rk3568.o hal_debug.o libserial.o printf.o libmem.o usyscall.o arch_usyscall.o session.o libipc.o
@${ld} ${user_ldflags} -e main -o $@ $^ ${board_specs}
@${objdump} -S $@ > $@.asm

View File

@ -1,42 +0,0 @@
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
// init: The initial user-level program
#include <stdbool.h>
#include "libfs.h"
#include "libserial.h"
#include "usyscall.h"
int main(int argc, char* argv[])
{
struct Session session;
printf("init: connecting MemFS\n");
while (connect_session(&session, "MemFS", 8092) < 0)
;
printf("init: connect MemFS success\n");
int fd;
char* shell_task_param[2] = { "/shell", 0 };
if ((fd = open(&session, shell_task_param[0])) < 0) {
printf("Open %s failed\n", shell_task_param[0]);
exit(1);
}
if (spawn(&session, fd, read, fsize, shell_task_param[0], shell_task_param) < 0) {
printf("Syscall Spawn shell failed\n");
}
close(&session, fd);
exit(0);
return 0;
}

View File

@ -50,7 +50,7 @@ int main(void)
shellInit(&shell, shellBuffer, 512); shellInit(&shell, shellBuffer, 512);
while (connect_session(&session_fs, "MemFS", 8092) < 0) while (connect_session(&session_fs, "MemFS", 0x10000) < 0)
; ;
if (!session_fs.buf) { if (!session_fs.buf) {
printf("session connect faield\n"); printf("session connect faield\n");

View File

@ -108,7 +108,7 @@ int main(int argc, char** argv)
struct Session fs_session; struct Session fs_session;
static char id_buf[33] = { 0 }; static char id_buf[33] = { 0 };
if (id > 1) { if (id > 1) {
if (connect_session(&fs_session, "MemFS", 8192) < 0) { if (connect_session(&fs_session, "MemFS", 0x4000) < 0) {
printf("connect fs_session failed\n"); printf("connect fs_session failed\n");
} else { } else {
int fd; int fd;

View File

@ -30,8 +30,7 @@ int IPC_DO_SERVE_FUNC(Ipc_hello_string)(char* buf, int* len)
return 0; return 0;
} }
// IPC_SERVER_INTERFACE(Ipc_add, 2); IPC_SERVER_INTERFACE(Ipc_add, 2);
IPC_SERVER_THREAD_INTERFACE(Ipc_add, 2);
IPC_SERVER_INTERFACE(Ipc_hello_string, 2); IPC_SERVER_INTERFACE(Ipc_hello_string, 2);
IPC_SERVER_REGISTER_INTERFACES(IpcSimpleServer, 2, Ipc_hello_string, Ipc_add); IPC_SERVER_REGISTER_INTERFACES(IpcSimpleServer, 2, Ipc_hello_string, Ipc_add);

View File

@ -0,0 +1,78 @@
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
// test_net: Test the lwip network stack
#include "libserial.h"
#include "lwip_service.h"
#include "usyscall.h"
static char udp_ip_str[128] = {0};
static uint16_t udp_socket_port = 8888;
#define UDP_DEMO_SEND_TIMES 3
int main(int argc, char* argv[])
{
printf("lwip network stack test \n");
int cnt = UDP_DEMO_SEND_TIMES;
char send_str[128];
int fd = -1;
memset(send_str, 0, sizeof(send_str));
struct Session sess;
connect_session(&sess, "LWIPServer", 4096);
printf("%s %d\n", __func__, __LINE__);
fd = ipc_socket(&sess, AF_INET, SOCK_DGRAM, 0);
if(fd < 0) {
printf("Socket error\n");
return 0;
}
printf("%s %d\n", __func__, __LINE__);
struct sockaddr_in udp_sock;
udp_sock.sin_family = AF_INET;
udp_sock.sin_port = htons(udp_socket_port);
udp_sock.sin_addr.s_addr = inet_addr(udp_ip_str);
memset(&(udp_sock.sin_zero), 0, sizeof(udp_sock.sin_zero));
printf("%s %d\n", __func__, __LINE__);
if(ipc_connect(&sess, fd, (struct sockaddr *)&udp_sock, sizeof(struct sockaddr)) < 0) {
printf("Unable to connect %s:%d\n", udp_ip_str, udp_socket_port);
ipc_close(&sess,fd);
return 0;
}
printf("%s %d\n", __func__, __LINE__);
printf("UDP connect %s:%d success, start to send.\n",
udp_ip_str,
udp_socket_port);
while(cnt --) {
snprintf(send_str, sizeof(send_str), "UDP test package times %d\r\n", cnt);
ipc_send(&sess, fd, send_str, strlen(send_str), 0);
printf("Send UDP msg: %s ", send_str);
}
ipc_close(&sess,fd);
free_session(&sess);
exit(0);
return 0;
}

View File

@ -8,10 +8,10 @@ toolchain ?= arm-xilinx-eabi-
user_ldflags = -N -Ttext 0 user_ldflags = -N -Ttext 0
cflags = -march=armv7-a -std=c11 -mtune=cortex-a9 -nostdlib -nodefaultlibs -mfloat-abi=soft -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -ggdb -Wno-unused -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie cflags = -march=armv7-a -std=c11 -mtune=cortex-a9 -nostdlib -nodefaultlibs -mfloat-abi=soft -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -ggdb -Wno-unused -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie
endif endif
ifeq ($(BOARD), ok1028a-c) ifeq ($(BOARD), 3568)
toolchain ?= aarch64-none-elf- toolchain ?= aarch64-none-elf-
user_ldflags = -N -Ttext 0 user_ldflags = -N -Ttext 0
cflags = -Wall -g -std=c11 -mtune=cortex-a72 -nostdlib -nodefaultlibs -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -ggdb -Wno-unused -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie cflags = -Wall -O0 -g -std=c11 -mtune=cortex-a55 -nostdlib -nodefaultlibs -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -ggdb -Wno-unused -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie
endif endif
cc = ${toolchain}gcc cc = ${toolchain}gcc

View File

@ -0,0 +1,250 @@
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
/// this file is only used for debug
#include <stddef.h>
#include <stdint.h>
#include "libserial.h"
#include "usyscall.h"
/*
* For driver model we always use one byte per register, and sort out the
* differences in the driver
*/
#define CONFIG_SYS_NS16550_REG_SIZE (-1)
#define UART_REG(x) \
unsigned char x; \
unsigned char postpad_##x[-CONFIG_SYS_NS16550_REG_SIZE - 1];
/**
* struct ns16550_platdata - information about a NS16550 port
*
* @base: Base register address
* @reg_shift: Shift size of registers (0=byte, 1=16bit, 2=32bit...)
* @clock: UART base clock speed in Hz
*/
struct ns16550_platdata {
unsigned long base;
int reg_shift;
int clock;
int reg_offset;
uint32_t fcr;
};
struct udevice;
struct NS16550 {
UART_REG(rbr); /* 0 */
UART_REG(ier); /* 1 */
UART_REG(fcr); /* 2 */
UART_REG(lcr); /* 3 */
UART_REG(mcr); /* 4 */
UART_REG(lsr); /* 5 */
UART_REG(msr); /* 6 */
UART_REG(spr); /* 7 */
#ifdef CONFIG_SOC_DA8XX
UART_REG(reg8); /* 8 */
UART_REG(reg9); /* 9 */
UART_REG(revid1); /* A */
UART_REG(revid2); /* B */
UART_REG(pwr_mgmt); /* C */
UART_REG(mdr1); /* D */
#else
UART_REG(mdr1); /* 8 */
UART_REG(reg9); /* 9 */
UART_REG(regA); /* A */
UART_REG(regB); /* B */
UART_REG(regC); /* C */
UART_REG(regD); /* D */
UART_REG(regE); /* E */
UART_REG(uasr); /* F */
UART_REG(scr); /* 10*/
UART_REG(ssr); /* 11*/
#endif
#ifdef CONFIG_DM_SERIAL
struct ns16550_platdata* plat;
#endif
};
#define thr rbr
#define iir fcr
#define dll rbr
#define dlm ier
typedef struct NS16550* NS16550_t;
/*
* These are the definitions for the FIFO Control Register
*/
#define UART_FCR_FIFO_EN 0x01 /* Fifo enable */
#define UART_FCR_CLEAR_RCVR 0x02 /* Clear the RCVR FIFO */
#define UART_FCR_CLEAR_XMIT 0x04 /* Clear the XMIT FIFO */
#define UART_FCR_DMA_SELECT 0x08 /* For DMA applications */
#define UART_FCR_TRIGGER_MASK 0xC0 /* Mask for the FIFO trigger range */
#define UART_FCR_TRIGGER_1 0x00 /* Mask for trigger set at 1 */
#define UART_FCR_TRIGGER_4 0x40 /* Mask for trigger set at 4 */
#define UART_FCR_TRIGGER_8 0x80 /* Mask for trigger set at 8 */
#define UART_FCR_TRIGGER_14 0xC0 /* Mask for trigger set at 14 */
#define UART_FCR_RXSR 0x02 /* Receiver soft reset */
#define UART_FCR_TXSR 0x04 /* Transmitter soft reset */
/* Ingenic JZ47xx specific UART-enable bit. */
#define UART_FCR_UME 0x10
/* Clear & enable FIFOs */
#define UART_FCR_DEFVAL (UART_FCR_FIFO_EN | UART_FCR_RXSR | UART_FCR_TXSR)
/*
* These are the definitions for the Modem Control Register
*/
#define UART_MCR_DTR 0x01 /* DTR */
#define UART_MCR_RTS 0x02 /* RTS */
#define UART_MCR_OUT1 0x04 /* Out 1 */
#define UART_MCR_OUT2 0x08 /* Out 2 */
#define UART_MCR_LOOP 0x10 /* Enable loopback test mode */
#define UART_MCR_AFE 0x20 /* Enable auto-RTS/CTS */
#define UART_MCR_DMA_EN 0x04
#define UART_MCR_TX_DFR 0x08
/*
* These are the definitions for the Line Control Register
*
* Note: if the word length is 5 bits (UART_LCR_WLEN5), then setting
* UART_LCR_STOP will select 1.5 stop bits, not 2 stop bits.
*/
#define UART_LCR_WLS_MSK 0x03 /* character length select mask */
#define UART_LCR_WLS_5 0x00 /* 5 bit character length */
#define UART_LCR_WLS_6 0x01 /* 6 bit character length */
#define UART_LCR_WLS_7 0x02 /* 7 bit character length */
#define UART_LCR_WLS_8 0x03 /* 8 bit character length */
#define UART_LCR_STB 0x04 /* # stop Bits, off=1, on=1.5 or 2) */
#define UART_LCR_PEN 0x08 /* Parity eneble */
#define UART_LCR_EPS 0x10 /* Even Parity Select */
#define UART_LCR_STKP 0x20 /* Stick Parity */
#define UART_LCR_SBRK 0x40 /* Set Break */
#define UART_LCR_BKSE 0x80 /* Bank select enable */
#define UART_LCR_DLAB 0x80 /* Divisor latch access bit */
/*
* These are the definitions for the Line Status Register
*/
#define UART_LSR_DR 0x01 /* Data ready */
#define UART_LSR_OE 0x02 /* Overrun */
#define UART_LSR_PE 0x04 /* Parity error */
#define UART_LSR_FE 0x08 /* Framing error */
#define UART_LSR_BI 0x10 /* Break */
#define UART_LSR_THRE 0x20 /* Xmit holding register empty */
#define UART_LSR_TEMT 0x40 /* Xmitter empty */
#define UART_LSR_ERR 0x80 /* Error */
#define UART_MSR_DCD 0x80 /* Data Carrier Detect */
#define UART_MSR_RI 0x40 /* Ring Indicator */
#define UART_MSR_DSR 0x20 /* Data Set Ready */
#define UART_MSR_CTS 0x10 /* Clear to Send */
#define UART_MSR_DDCD 0x08 /* Delta DCD */
#define UART_MSR_TERI 0x04 /* Trailing edge ring indicator */
#define UART_MSR_DDSR 0x02 /* Delta DSR */
#define UART_MSR_DCTS 0x01 /* Delta CTS */
/*
* These are the definitions for the Interrupt Identification Register
*/
#define UART_IIR_NO_INT 0x01 /* No interrupts pending */
#define UART_IIR_ID 0x06 /* Mask for the interrupt ID */
#define UART_IIR_MSI 0x00 /* Modem status interrupt */
#define UART_IIR_THRI 0x02 /* Transmitter holding register empty */
#define UART_IIR_RDI 0x04 /* Receiver data interrupt */
#define UART_IIR_RLSI 0x06 /* Receiver line status interrupt */
/*
* These are the definitions for the Interrupt Enable Register
*/
#define UART_IER_MSI 0x08 /* Enable Modem status interrupt */
#define UART_IER_RLSI 0x04 /* Enable receiver line status interrupt */
#define UART_IER_THRI 0x02 /* Enable Transmitter holding register int. */
#define UART_IER_RDI 0x01 /* Enable receiver data interrupt */
/* useful defaults for LCR */
#define UART_LCR_8N1 0x03
#define UART_ADDR (0xFE660000)
#define UART_LCRVAL UART_LCR_8N1 /* 8 data, 1 stop, no parity */
#define UART_MCRVAL (UART_MCR_DTR | UART_MCR_RTS) /* RTS/DTR */
#define out_le32(a, v) (*(volatile uint32_t*)(a) = (v))
#define in_le32(a) (*(volatile uint32_t*)(a))
#ifndef CONFIG_SYS_NS16550_IER
#define CONFIG_SYS_NS16550_IER 0x00
#endif /* CONFIG_SYS_NS16550_IER */
#define serial_dout(reg, value) \
serial_out_shift((char*)com_port + ((char*)reg - (char*)com_port) * (1 << 2), \
2, value)
#define serial_din(reg) \
serial_in_shift((char*)com_port + ((char*)reg - (char*)com_port) * (1 << 2), \
2)
static inline void serial_out_shift(void* addr, int shift, int value)
{
out_le32(addr, value);
}
static inline int serial_in_shift(void* addr, int shift)
{
return in_le32(addr);
}
#ifndef CONFIG_SYS_NS16550_CLK
#define CONFIG_SYS_NS16550_CLK 0
#endif
bool init_uart_mmio()
{
static int mapped = 0;
if (mapped == 0) {
if (-1 == mmap(UART_ADDR, UART_ADDR, 4096, true)) {
return false;
}
mapped = 1;
}
return true;
}
void putc(char ch)
{
static struct NS16550* com_port = (struct NS16550*)UART_ADDR;
if (ch == '\n') {
putc('\r');
}
while (!(serial_din(&com_port->lsr) & UART_LSR_THRE))
;
serial_dout(&com_port->thr, ch);
}
char getc(void)
{
static struct NS16550* com_port = (struct NS16550*)UART_ADDR;
while (!(serial_din(&com_port->lsr) & UART_LSR_DR))
;
return serial_din(&com_port->rbr);
}

View File

@ -8,10 +8,10 @@ toolchain ?= arm-xilinx-eabi-
user_ldflags = -N -Ttext 0 user_ldflags = -N -Ttext 0
cflags = -march=armv7-a -std=c11 -mtune=cortex-a9 -nostdlib -nodefaultlibs -mfloat-abi=soft -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -ggdb -Wno-unused -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie cflags = -march=armv7-a -std=c11 -mtune=cortex-a9 -nostdlib -nodefaultlibs -mfloat-abi=soft -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -ggdb -Wno-unused -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie
endif endif
ifeq ($(BOARD), ok1028a-c) ifeq ($(BOARD), 3568)
toolchain ?= aarch64-none-elf- toolchain ?= aarch64-none-elf-
user_ldflags = -N -Ttext 0 user_ldflags = -N -Ttext 0
cflags = -Wall -g -std=c11 -mtune=cortex-a72 -nostdlib -nodefaultlibs -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -ggdb -Wno-unused -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie cflags = -Wall -O0 -g -std=c11 -mtune=cortex-a55 -nostdlib -nodefaultlibs -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -ggdb -Wno-unused -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie
endif endif
cc = ${toolchain}gcc cc = ${toolchain}gcc

View File

@ -1,113 +0,0 @@
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
/// this file is only used for debug
#include "libserial.h"
#include "usyscall.h"
#define USER_UART_BASE 0x6FFFF000
#define UART0_BASE (0x09000000ULL)
#define UART0_REG(reg) ((volatile uint32_t*)(USER_UART_BASE + reg))
// the UART control registers.
// pl011
#define DR 0x00
#define FR 0x18
#define FR_RXFE (1 << 4) // recieve fifo empty
#define FR_TXFF (1 << 5) // transmit fifo full
#define FR_RXFF (1 << 6) // recieve fifo full
#define FR_TXFE (1 << 7) // transmit fifo empty
#define IBRD 0x24
#define FBRD 0x28
#define LCRH 0x2c
#define LCRH_FEN (1 << 4)
#define LCRH_WLEN_8BIT (3 << 5)
#define CR 0x30
#define IMSC 0x38
#define INT_RX_ENABLE (1 << 4)
#define INT_TX_ENABLE (1 << 5)
#define ICR 0x44
#define UART_READ_REG(reg) (*(UART0_REG(reg)))
#define UART_WRITE_REG(reg, v) (*(UART0_REG(reg)) = (v))
#define UART_TX_BUF_SIZE 32
static char uart_tx_buf[UART_TX_BUF_SIZE];
uint64_t uart_tx_w; // write next to uart_tx_buf[uart_tx_w % UART_TX_BUF_SIZE]
uint64_t uart_tx_r; // read next from uart_tx_buf[uart_tx_r % UART_TX_BUF_SIZE]
bool init_uart_mmio()
{
static int mapped = 0;
if (mapped == 0) {
if (-1 == mmap(USER_UART_BASE, UART0_BASE, 4096, true)) {
return false;
}
mapped = 1;
}
return true;
}
// if the UART is idle, and a character is waiting
// in the transmit buffer, send it.
// caller must hold uart_tx_lock.
// called from both the top- and bottom-half.
void uartstart()
{
while (1) {
if (uart_tx_w == uart_tx_r) {
// transmit buffer is empty.
return;
}
if (UART_READ_REG(FR) & FR_TXFF) {
// the UART transmit holding register is full,
// so we cannot give it another byte.
// it will interrupt when it's ready for a new byte.
return;
}
int c = uart_tx_buf[uart_tx_r % UART_TX_BUF_SIZE];
uart_tx_r += 1;
// maybe uartputc() is waiting for space in the buffer.
UART_WRITE_REG(DR, c);
}
}
// add a character to the output buffer and tell the
// UART to start sending if it isn't already.
// blocks if the output buffer is full.
// because it may block, it can't be called
// from interrupts; it's only suitable for use
// by write().
void putc(char c)
{
while (uart_tx_w == uart_tx_r + UART_TX_BUF_SIZE)
;
uart_tx_buf[uart_tx_w % UART_TX_BUF_SIZE] = c;
uart_tx_w += 1;
uartstart();
return;
}
// read one input character from the UART.
// return -1 if none is waiting.
char getc(void)
{
if (UART_READ_REG(FR) & FR_RXFE)
return 0xFF;
else
return UART_READ_REG(DR);
}

View File

@ -9,10 +9,10 @@ user_ldflags = --start-group,-lgcc,-lc,--end-group
cflags = -std=c11 -march=armv7-a -mtune=cortex-a9 -nostdlib -nodefaultlibs -mfloat-abi=soft -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -ggdb -Wno-unused -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie cflags = -std=c11 -march=armv7-a -mtune=cortex-a9 -nostdlib -nodefaultlibs -mfloat-abi=soft -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -ggdb -Wno-unused -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie
#cflags = -Wall -g -std=c11 #cflags = -Wall -g -std=c11
endif endif
ifeq ($(BOARD), ok1028a-c) ifeq ($(BOARD), 3568)
toolchain ?= aarch64-none-elf- toolchain ?= aarch64-none-elf-
user_ldflags = -N -Ttext 0 user_ldflags = -N -Ttext 0
cflags = -Wall -g -std=c11 -mtune=cortex-a72 -nostdlib -nodefaultlibs -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -ggdb -Wno-unused -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie cflags = -Wall -O0 -g -std=c11 -mtune=cortex-a55 -nostdlib -nodefaultlibs -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -ggdb -Wno-unused -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie
endif endif
cc = ${toolchain}gcc cc = ${toolchain}gcc

View File

@ -1,3 +1,4 @@
SRC_DIR :=
SRC_DIR := hal
include $(KERNEL_ROOT)/compiler.mk include $(KERNEL_ROOT)/compiler.mk

View File

@ -0,0 +1,62 @@
ifeq ($(BOARD), imx6q-sabrelite)
toolchain ?= arm-none-eabi-
user_ldflags = --specs=nosys.specs -Wl,-Map=user.map,-cref -N
cflags = -std=c11 -O2 -march=armv7-a -mtune=cortex-a9 -nostdlib -nodefaultlibs -mfloat-abi=soft -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -ggdb -Wno-unused -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie
endif
ifeq ($(BOARD), zynq7000-zc702)
toolchain ?= arm-xilinx-eabi-
user_ldflags = -Wl,--start-group,-lgcc,-lc,--end-group -N
cflags = -std=c11 -O2 -march=armv7-a -mtune=cortex-a9 -nostdlib -nodefaultlibs -mfloat-abi=soft -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -ggdb -Wno-unused -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie
board_specs = stub.o
#cflags = -Wall -g -std=c11
endif
ifeq ($(BOARD), ok1028a-c)
toolchain ?= aarch64-none-elf-
user_ldflags = -N -Ttext 0
cflags = -g -std=c11 -mtune=cortex-a72 -nostdlib -nodefaultlibs -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -Werror -ggdb -Wno-unused -fno-omit-frame-pointer -fno-stack-protector -fno-pie
board_specs = stub.o
endif
ifeq ($(BOARD), 3568)
toolchain ?= aarch64-none-elf-
user_ldflags = -N -Ttext 0
cflags = -Wall -g -std=c11 -mtune=cortex-a55 -nostdlib -nodefaultlibs -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -ggdb -Wno-unused -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie
board_specs = $(KERNEL_ROOT)/services/app/stub.o
endif
cc = ${toolchain}gcc
ld = ${toolchain}g++
objdump = ${toolchain}objdump
c_useropts = -O2
# c_useropts = -O0
INC_DIR = -I$(KERNEL_ROOT)/services/app \
-I$(KERNEL_ROOT)/services/boards/$(BOARD) \
-I$(KERNEL_ROOT)/services/lib/serial \
-I$(KERNEL_ROOT)/services/drivers/3568/include \
-I$(KERNEL_ROOT)/services/lib/usyscall \
-I$(KERNEL_ROOT)/services/lib/ipc \
-I$(KERNEL_ROOT)/services/lib/memory
objs = hal_gmac.o \
hal_gmac_3568.o \
test_gmac.o \
hal_base.o \
hal_bsp.o \
hal_pinctrl_v2.o \
hal_cru.o \
hal_gpio.o \
hal_timer.o \
hal_cru_rk3568.o \
hal_debug.o \
system_rk3568.o \
all: ${objs}
@mv $^ $(KERNEL_ROOT)/services/app
%.o: %.c
@echo "cc $^"
@${cc} ${cflags} ${c_useropts} ${INC_DIR} -o $@ -c $^

View File

@ -0,0 +1,454 @@
/* SPDX-License-Identifier: BSD-3-Clause */
/*
* Copyright (c) 2020-2021 Rockchip Electronics Co., Ltd.
*/
#include "hal_base.h"
/** @addtogroup RK_HAL_Driver
* @{
*/
/** @addtogroup HAL_BASE
* @{
*/
/** @defgroup HAL_BASE_How_To_Use How To Use
* @{
HAL system support is including delay system, HAL tick system and global system clock,
HAL system tick setting:
- Attach HAL_IncTick() to system tick interrupt handler;
- Notify the HAL system the system's tick frequency by calling HAL_SetTickFreq() unless
it is the same as default value HAL_TICK_FREQ_1KHZ;
- If you need a more accurate delay system, specify SYS_TIMER in hal_conf.h.
Init HAL system:
- Initialize the HAL system by calling HAL_Init():
Reset when SOC system is changed:
- Update system with new core clock and new SysTick clock source by calling HAL_SystemCoreClockUpdate();
APIs:
- Get system time by calling HAL_GetTick().
- Delay for a certain length of time, HAL_DelayMs(), HAL_DelayUs(), and HAL_CPUDelayUs().
- Blocking for a certain period of time to continuously query HW status, use HAL_GetTick()
to do timeout, this will be more accurate.
- Get current cpu usage by calling HAL_GetCPUUsage().
@} */
/** @defgroup HAL_BASE_Private_Definition Private Definition
* @{
*/
/********************* Private MACRO Definition ******************************/
#define HAL_TICK_FREQ_DEFAULT HAL_TICK_FREQ_1KHZ
/********************* Private Structure Definition **************************/
/********************* Private Variable Definition ***************************/
static __IO uint32_t uwTick;
static eHAL_tickFreq uwTickFreq = HAL_TICK_FREQ_DEFAULT;
/********************* Private Function Definition ***************************/
#if defined(__CORTEX_A) || defined(__CORTEX_M)
#if __CORTEX_M == 0U || !defined(__GNUC__)
static void CPUCycleLoop(uint32_t cycles)
{
uint32_t count;
if (cycles < 100U) {
return;
}
count = cycles / 3;
while (count-- > 0) {
__asm volatile ("nop");
}
}
#else
static void CPUCycleLoop(uint32_t cycles)
{
__ASM volatile (
"mov r0, %0\n\t"
"adds r0, r0, #2\n\t" // 1 2 Round to the nearest multiple of 4.
"lsrs r0, r0, #2\n\t" // 1 2 Divide by 4 and set flags.
"beq 2f\n\t" // 2 2 Skip if 0.
".align 4\n\t"
"1:\n\t"
"adds r0, r0, #1\n\t" // 1 2 Increment the counter.
"subs r0, r0, #2\n\t" // 1 2 Decrement the counter by 2.
"bne 1b\n\t" // (1)2 2 2 CPU cycles (if branch is taken).
"nop\n\t" // 1 2 Loop alignment padding.
"2:"
: : "r" (cycles)
);
}
#endif
#elif defined(__RISC_V)
static void CPUCycleLoop(uint32_t cycles)
{
asm volatile (
"mv a0, %0\n\t"
"addi a0, a0, 2\n\t" // 1 2 Round to the nearest multiple of 4.
"li a1, 4\n\t"
"div a0, a0, a1\n\t" // 1 2 Divide by 4 and set flags.
"li a1, 2\n\t"
"bnez a0, 1f\n\t" // 2 2 Skip if 0.
"j 2f\n\t"
".align 6\n\t"
"1:\n\t"
"addi a0, a0, 1\n\t" // 1 2 Increment the counter.
"sub a0, a0, a1\n\t" // 1 2 Decrement the counter by 2.
"bnez a0, 1b\n\t" // (1)2 2 2 CPU cycles (if branch is taken).
"nop\n\t" // 1 2 Loop alignment padding.
"2:"
: : "r" (cycles)
);
}
#endif
#if defined(SYS_TIMER) && defined(HAL_TIMER_MODULE_ENABLED)
__attribute__((always_inline)) static inline HAL_Status TimerDelayUs(uint32_t us)
{
uint64_t count, from, now, pass;
from = HAL_TIMER_GetCount(SYS_TIMER);
count = PLL_INPUT_OSC_RATE / 1000000 * us;
do {
now = HAL_TIMER_GetCount(SYS_TIMER);
pass = now > from ? now - from : from - now;
} while (pass < count);
return HAL_OK;
}
#endif
/** @} */
/********************* Public Function Definition ***************************/
/** @defgroup HAL_BASE_Exported_Functions_Group4 Init and DeInit Functions
This section provides functions allowing to init and deinit the module:
* @{
*/
/**
* @brief Init HAL driver basic code.
* @return HAL_OK.
*/
HAL_Status HAL_Init(void)
{
#ifdef __CORTEX_M
#ifdef HAL_NVIC_MODULE_ENABLED
/* Set Interrupt Group Priority */
HAL_NVIC_Init();
/* Set Interrupt Group Priority */
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_DEFAULT);
#endif
#endif
#if defined(SYS_TIMER) && defined(HAL_TIMER_MODULE_ENABLED)
HAL_TIMER_SysTimerInit(SYS_TIMER);
#endif
#ifdef HAL_PINCTRL_MODULE_ENABLED
HAL_PINCTRL_Init();
#endif
return HAL_OK;
}
/**
* @brief HAL system update with new core clock and systick clock source.
* @param hz: new core clock.
* @param clkSource: new systick clock source.
* @return HAL_OK.
*/
HAL_Status HAL_SystemCoreClockUpdate(uint32_t hz, eHAL_systickClkSource clkSource)
{
uint32_t rate = hz;
HAL_Status ret = HAL_OK;
#if defined(__CORTEX_M) && defined(HAL_SYSTICK_MODULE_ENABLED)
ret = HAL_SYSTICK_CLKSourceConfig(clkSource);
if (ret == HAL_OK && clkSource == HAL_SYSTICK_CLKSRC_EXT) {
rate = PLL_INPUT_OSC_RATE;
}
HAL_SYSTICK_Config(rate / (1000 / HAL_GetTickFreq()));
ret = HAL_OK;
#endif
if (ret == HAL_OK) {
SystemCoreClock = rate; /* Update global SystemCoreClock */
}
return ret;
}
/**
* @brief HAL deinit.
* @return HAL_Status: HAL_OK.
*/
HAL_Status HAL_DeInit(void)
{
/* TO-DO */
return HAL_OK;
}
/** @} */
/** @defgroup HAL_BASE_Exported_Functions_Group5 Other Functions
* @{
*/
/**
* @brief Count plus tickFreq when interrupt occurs.
* @return HAL_Status: HAL_OK.
*/
HAL_Status HAL_IncTick(void)
{
uwTick += uwTickFreq;
return HAL_OK;
}
/**
* @brief Provides tick value in millisecond.
* @return uint32_t: tick value in millisecond.
* @attention this API allow direct use in the HAL layer.
*/
uint32_t HAL_GetTick(void)
{
#if defined(SYS_TIMER) && defined(HAL_TIMER_MODULE_ENABLED)
uint64_t tick = HAL_TIMER_GetCount(SYS_TIMER);
uint32_t base = PLL_INPUT_OSC_RATE / 1000;
if (tick >> 62) {
tick = ~tick;
}
return (uint32_t)HAL_DivU64(tick, base);
#else
return uwTick;
#endif
}
/**
* @brief Provides system timer count.
* @return uint64_t: timer count.
* @attention this API allow direct use in the HAL layer.
*/
uint64_t HAL_GetSysTimerCount(void)
{
#if defined(SYS_TIMER) && defined(HAL_TIMER_MODULE_ENABLED)
uint64_t count = HAL_TIMER_GetCount(SYS_TIMER);
if (count >> 62) {
count = ~count;
}
return count;
#else
return 0LLU;
#endif
}
/**
* @brief Set new tick frequency.
* @return HAL_Status.
*/
HAL_Status HAL_SetTickFreq(eHAL_tickFreq freq)
{
HAL_ASSERT(IS_TICKFREQ(freq));
uwTickFreq = freq;
return HAL_OK;
}
/**
* @brief Return tick frequency.
* @return uint32_t: tick period in Hz.
* @attention this API allow direct use in the HAL layer.
*/
eHAL_tickFreq HAL_GetTickFreq(void)
{
return uwTickFreq;
}
/**
* @brief SysTick mdelay.
* @param ms: mdelay count.
* @return HAL_Status: HAL_OK.
* @attention this API allow direct use in the HAL layer. Blocking for a
* certain period of time to continuously query HW status, use HAL_GetTick
* to do timeout, that will be more accurate.
*/
__attribute__((weak)) HAL_Status HAL_DelayMs(uint32_t ms)
{
for (uint32_t i = 0; i < ms; i++) {
HAL_DelayUs(1000);
}
return HAL_OK;
}
/**
* @brief SysTick udelay.
* @param us: udelay count.
* @return HAL_Status: HAL_OK.
* @attention this API allow direct use in the HAL layer. The longer the delay,
* the more accurate. Actual delay is greater than the parameter.
*/
HAL_Status HAL_DelayUs(uint32_t us)
{
#if defined(SYS_TIMER) && defined(HAL_TIMER_MODULE_ENABLED)
return TimerDelayUs(us);
#else
return HAL_CPUDelayUs(us);
#endif
}
/**
* @brief CPU loop udelay.
* @param us: udelay count.
* @return HAL_Status: HAL_OK.
* @attention this API allow direct use in the HAL layer. The longer the delay,
* the more accurate. Actual delay is greater than the parameter.
* During delay, CPU rate change result in delay imprecise, so call it in
* following case:
* 1.IRQ disable
* 2.CRU code
*/
HAL_Status HAL_CPUDelayUs(uint32_t us)
{
volatile uint32_t cycles;
#if (__CORTEX_M == 0)
cycles = (uint32_t)HAL_DivU64((uint64_t)SystemCoreClock, 1000000) * us; /* Add few cycles penalty */
#else
cycles = SystemCoreClock / 1000000 * us; /* Add few cycles penalty */
#endif
CPUCycleLoop(cycles);
return HAL_OK;
}
#if defined(HAL_CPU_USAGE_ENABLED)
static uint64_t g_last_enter_idle_time = 0; /* Last time current CPU entered the idle state. */
static uint64_t g_total_idle_time = 0; /* Total time for current CPU to enter idle state. */
static uint64_t g_last_elapsed_time = 0; /* Last elapsed time for current CPU. */
/**
* @brief Get current CPU usage.
* @return 0-100
* @attention The cpu usage function depends on HAL_CPUEnterIdle function.
*/
uint32_t HAL_GetCPUUsage(void)
{
uint64_t elapsed_time, active_time, current_time;
uint32_t usage;
current_time = HAL_GetSysTimerCount();
elapsed_time = current_time - g_last_elapsed_time;
/* Prevent the risk of dividing by 0 caused by repeated calls for a short time. */
if (!elapsed_time) {
return 0;
}
HAL_ASSERT(elapsed_time > g_total_idle_time);
active_time = elapsed_time - g_total_idle_time;
usage = (active_time * 100) / elapsed_time;
g_total_idle_time = 0;
g_last_elapsed_time = current_time;
return usage;
}
#endif
/**
* @brief CPU enter idle.
*/
void HAL_CPU_EnterIdle(void)
{
#if defined(HAL_CPU_USAGE_ENABLED)
uint64_t idle_time;
__disable_irq();
g_last_enter_idle_time = HAL_GetSysTimerCount();
#endif
// __asm__ volatile ("wfi");
#if defined(HAL_CPU_USAGE_ENABLED)
idle_time = HAL_GetSysTimerCount() - g_last_enter_idle_time;
g_total_idle_time += idle_time;
__enable_irq();
#endif
}
/** @} */
/** @} */
/** @} */
/********************* Public Function Definition ***************************/
/** @defgroup HAL_BASE_EX_Exported_Functions_Group5 Other Functions
* @{
*/
/**
* @brief uint64_t numerator / uint32_t denominator with remainder
* @param numerator
* @param denominator
* @param pRemainder [out] pointer to unsigned 32bit remainder
* @return uint64_t result. sets *pRemainder if pRemainder is not null
*/
uint64_t HAL_DivU64Rem(uint64_t numerator, uint32_t denominator, uint32_t *pRemainder)
{
uint64_t remainder = numerator;
uint64_t b = denominator;
uint64_t result;
uint64_t d = 1;
uint32_t high = numerator >> 32;
result = 0;
if (high >= denominator) {
high /= denominator;
result = (uint64_t)high << 32;
remainder -= (uint64_t)(high * denominator) << 32;
}
while ((int64_t)b > 0 && b < remainder) {
b = b + b;
d = d + d;
}
do {
if (remainder >= b) {
remainder -= b;
result += d;
}
b >>= 1;
d >>= 1;
} while (d);
if (pRemainder) {
*pRemainder = remainder;
}
return result;
}

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