From 2d027477aee6b9b6be6d34338bb882dc1aa9b903 Mon Sep 17 00:00:00 2001 From: Deepak Khatri <lorforlinux@beagleboard.org> Date: Wed, 2 Nov 2022 02:48:05 +0530 Subject: [PATCH] Squashed commit of the following: commit 4ab3ff82f7f27693d6c34b80d0dab5713889c345 Author: Jason Kridner <jkridner@beagleboard.org> Date: Tue Oct 25 21:38:16 2022 -0400 More spelling fixes commit fce576baedbdb5b39ea36644aba3032c078aa10f Author: Jason Kridner <jkridner@beagleboard.org> Date: Tue Oct 25 13:52:28 2022 -0400 Fixed a bunch of spelling and linking errors commit 185218eea48dfcffb544dc9e9509bec87f3aaa25 Merge: 39c2dd7 c3b7fb7 Author: Jason Kridner <jkridner@beagleboard.org> Date: Mon Oct 24 13:58:46 2022 -0400 Merge branch 'main' of git.beagleboard.org:docs/docs.beagleboard.io commit 39c2dd787ce8fa73031d86132cf8c26004bf557a Author: Jason Kridner <jkridner@beagleboard.org> Date: Mon Oct 24 13:54:54 2022 -0400 books/pru-cookbook/code: fix some spelling issues commit c3de7ef6b26c3849b4a511cbc31d055037a695bd Author: Jason Kridner <jkridner@beagleboard.org> Date: Mon Oct 24 13:44:15 2022 -0400 books/pru-cookbook: fix references to code commit c4a51c2282f7795d1ab7362b321270686651a7e7 Author: Jason Kridner <jkridner@beagleboard.org> Date: Mon Oct 24 12:18:03 2022 -0400 books/pru-cookbook: move code to submodule --- .gitmodules | 3 + boards/beaglebone/ai-64/ch04.rst | 2 +- boards/beaglebone/ai-64/ch07.rst | 2 +- boards/beaglebone/ai-64/ch11.rst | 2 +- boards/beaglebone/ai/ch12.rst | 1 + boards/beaglebone/black/ch07.rst | 8 +- boards/beaglebone/blue/accessories.rst | 7 +- boards/beaglebone/blue/tests.rst | 2 +- boards/beagleconnect/freedom/zephyr.rst | 2 +- boards/pocketbeagle/original/ch06.rst | 5 +- books/beaglebone-cookbook/01basics/basics.rst | 2 +- .../beaglebone-cookbook/02sensors/sensors.rst | 2 +- books/beaglebone-cookbook/09capes/capes.rst | 12 +- books/beaglebone-cookbook/10parts/parts.rst | 8 +- books/beaglebone-cookbook/code | 2 +- books/pru-cookbook/01case/case.rst | 70 +- books/pru-cookbook/01case/code/blink.sim | 7 - books/pru-cookbook/01case/code/circle.py | 43 - books/pru-cookbook/01case/code/e1.31-test.py | 70 - .../pru-cookbook/01case/code/encoder_setup.sh | 49 - books/pru-cookbook/01case/code/fire.fseq | Bin 614428 -> 0 bytes .../pru-cookbook/01case/code/logic_install.sh | 34 - books/pru-cookbook/01case/code/main_pru1.c | 53 - books/pru-cookbook/01case/code/my-config.json | 19 - books/pru-cookbook/01case/code/opc.py | 177 - books/pru-cookbook/01case/code/pru1-servo.asm | 162 - books/pru-cookbook/01case/code/servo-test.c | 84 - .../pru-cookbook/01case/code/servos_setup.sh | 24 - books/pru-cookbook/02start/code/Makefile | 1 - books/pru-cookbook/02start/code/ai.notes | 59 - books/pru-cookbook/02start/code/hello.pru0.c | 35 - .../pru-cookbook/02start/code/hello.pru1_1.c | 35 - books/pru-cookbook/02start/code/hello2.pru0.c | 42 - books/pru-cookbook/02start/code/hello2.pru1.c | 43 - .../pru-cookbook/02start/code/hello2.pru1_0.c | 63 - .../pru-cookbook/02start/code/hello2.pru1_1.c | 63 - .../pru-cookbook/02start/code/hello2.pru2_0.c | 63 - .../pru-cookbook/02start/code/hello2.pru2_1.c | 63 - books/pru-cookbook/02start/code/setup.sh | 5 - books/pru-cookbook/02start/code/setup2.sh | 5 - books/pru-cookbook/02start/start.rst | 63 +- books/pru-cookbook/03details/code/Makefile | 1 - .../03details/code/am335x_pru.cmd | 87 - .../03details/code/encoder_setup.sh | 49 - .../pru-cookbook/03details/code/gpio_setup.sh | 28 - .../03details/code/servos_setup.sh | 24 - books/pru-cookbook/03details/details.rst | 68 +- .../pru-cookbook/04debug/code/AM335x_PRU.cmd | 86 - books/pru-cookbook/04debug/code/Makefile | 1 - books/pru-cookbook/04debug/code/copyright.c | 32 - .../04debug/code/resource_table_empty.h | 72 - books/pru-cookbook/04debug/code/uart1.pru0.c | 88 - .../pru-cookbook/04debug/code/uart1.pru1_0.c | 90 - books/pru-cookbook/04debug/code/uart2.pru0.c | 126 - .../pru-cookbook/04debug/code/uart2.pru1_0.c | 126 - books/pru-cookbook/04debug/code/uart_setup.sh | 28 - books/pru-cookbook/05blocks/code/Makefile | 1 - books/pru-cookbook/05blocks/code/copyright.c | 32 - books/pru-cookbook/05blocks/code/input.pru0.c | 26 - .../pru-cookbook/05blocks/code/input_setup.sh | 27 - .../05blocks/code/module/.gitignore | 1 - .../05blocks/code/module/Makefile | 25 - .../05blocks/code/module/install.sh | 6 - .../code/module/rpmsg_client_sample.c | 102 - .../05blocks/code/module/rpmsg_pru.c | 359 -- .../05blocks/code/module/setup.sh | 1 - .../pru-cookbook/05blocks/code/neo-colors.py | 41 - .../pru-cookbook/05blocks/code/neo-rainbow.py | 27 - books/pru-cookbook/05blocks/code/neo1.pru0.c | 44 - .../pru-cookbook/05blocks/code/neo1.pru1_1.c | 44 - books/pru-cookbook/05blocks/code/neo2.pru0.c | 46 - .../pru-cookbook/05blocks/code/neo2.pru1_1.c | 46 - books/pru-cookbook/05blocks/code/neo3.pru0.c | 67 - .../pru-cookbook/05blocks/code/neo3.pru1_1.c | 67 - books/pru-cookbook/05blocks/code/neo4.pru0.c | 145 - .../pru-cookbook/05blocks/code/neo4.pru1_1.c | 145 - books/pru-cookbook/05blocks/code/neo_setup.sh | 28 - books/pru-cookbook/05blocks/code/pwm-test.c | 74 - books/pru-cookbook/05blocks/code/pwm1.pru0.c | 22 - .../pru-cookbook/05blocks/code/pwm1.pru1_1.c | 22 - books/pru-cookbook/05blocks/code/pwm2.pru0.c | 22 - books/pru-cookbook/05blocks/code/pwm3.pru0.c | 43 - books/pru-cookbook/05blocks/code/pwm4.pru0.c | 50 - books/pru-cookbook/05blocks/code/pwm5.pru0.c | 53 - books/pru-cookbook/05blocks/code/pwm6.pru0.c | 56 - books/pru-cookbook/05blocks/code/pwm7-test.c | 83 - books/pru-cookbook/05blocks/code/pwm7.pru0.c | 57 - books/pru-cookbook/05blocks/code/pwm7.pru1.c | 57 - .../pru-cookbook/05blocks/code/pwm7_setup.sh | 28 - books/pru-cookbook/05blocks/code/pwm8.pru0.c | 78 - books/pru-cookbook/05blocks/code/pwm8.pru1.c | 66 - books/pru-cookbook/05blocks/code/pwm_setup.sh | 28 - .../05blocks/code/resource_table_empty.h | 39 - books/pru-cookbook/05blocks/code/rgb1.pru0.c | 80 - books/pru-cookbook/05blocks/code/rgb2.pru0.c | 81 - books/pru-cookbook/05blocks/code/rgb3.pru0.c | 114 - books/pru-cookbook/05blocks/code/rgb4.pru0.c | 84 - books/pru-cookbook/05blocks/code/rgb_black.h | 31 - books/pru-cookbook/05blocks/code/rgb_pocket.h | 45 - .../pru-cookbook/05blocks/code/rgb_python.py | 78 - .../05blocks/code/rgb_python_setup.sh | 41 - books/pru-cookbook/05blocks/code/rgb_setup.sh | 41 - .../05blocks/code/rgb_white.pru0.c | 64 - .../pru-cookbook/05blocks/code/shared.pru0.c | 63 - .../05blocks/code/shared_setup.sh | 28 - books/pru-cookbook/05blocks/code/sine.map | 338 -- books/pru-cookbook/05blocks/code/sine.pru0.c | 58 - .../05blocks/code/write_init_pins.sh | 9 - books/pru-cookbook/06io/code/Makefile | 1 - books/pru-cookbook/06io/code/gpio.pru0.c | 23 - books/pru-cookbook/06io/code/setup.sh | 28 - books/pru-cookbook/06io/io.rst | 2 +- books/pru-cookbook/07more/code/Makefile | 1 - books/pru-cookbook/07more/code/copyright.c | 33 - books/pru-cookbook/07more/code/cycle.pru0.c | 32 - books/pru-cookbook/07more/code/cycle.pru0.lst | 3082 ----------------- .../07more/code/delay-test.pru0.c | 28 - .../07more/code/delay-test2.pru0.c | 32 - books/pru-cookbook/07more/code/delay.pru0.asm | 9 - .../pru-cookbook/07more/code/delay2.pru0.asm | 15 - books/pru-cookbook/07more/code/logic.c | 34 - books/pru-cookbook/07more/code/logic_setup.sh | 30 - .../07more/code/resource_table_pru0.h | 105 - books/pru-cookbook/07more/code/setup.sh | 30 - books/pru-cookbook/07more/code/xin.pru1.c | 34 - .../07more/code/xout-cycle.pru0.c | 62 - books/pru-cookbook/07more/code/xout.pru0.c | 52 - books/pru-cookbook/07more/code/xout_run.sh | 3 - books/pru-cookbook/07more/more.rst | 62 +- books/pru-cookbook/08ai/ai.rst | 26 +- books/pru-cookbook/08ai/code/Makefile | 1 - books/pru-cookbook/08ai/code/pwm1.pru2_1.c | 24 - books/pru-cookbook/code | 1 + books/pru-cookbook/projects.rst | 18 +- intro/contribution/git-usage.rst | 2 +- intro/support/getting-started.rst | 2 +- projects/simppru/examples/read_counter.rst | 2 +- 137 files changed, 197 insertions(+), 9088 deletions(-) delete mode 100644 books/pru-cookbook/01case/code/blink.sim delete mode 100755 books/pru-cookbook/01case/code/circle.py delete mode 100755 books/pru-cookbook/01case/code/e1.31-test.py delete mode 100755 books/pru-cookbook/01case/code/encoder_setup.sh delete mode 100644 books/pru-cookbook/01case/code/fire.fseq delete mode 100644 books/pru-cookbook/01case/code/logic_install.sh delete mode 100644 books/pru-cookbook/01case/code/main_pru1.c delete mode 100644 books/pru-cookbook/01case/code/my-config.json delete mode 100755 books/pru-cookbook/01case/code/opc.py delete mode 100644 books/pru-cookbook/01case/code/pru1-servo.asm delete mode 100644 books/pru-cookbook/01case/code/servo-test.c delete mode 100755 books/pru-cookbook/01case/code/servos_setup.sh delete mode 100644 books/pru-cookbook/02start/code/Makefile delete mode 100644 books/pru-cookbook/02start/code/ai.notes delete mode 100644 books/pru-cookbook/02start/code/hello.pru0.c delete mode 100644 books/pru-cookbook/02start/code/hello.pru1_1.c delete mode 100644 books/pru-cookbook/02start/code/hello2.pru0.c delete mode 100644 books/pru-cookbook/02start/code/hello2.pru1.c delete mode 100644 books/pru-cookbook/02start/code/hello2.pru1_0.c delete mode 100644 books/pru-cookbook/02start/code/hello2.pru1_1.c delete mode 100644 books/pru-cookbook/02start/code/hello2.pru2_0.c delete mode 100644 books/pru-cookbook/02start/code/hello2.pru2_1.c delete mode 100755 books/pru-cookbook/02start/code/setup.sh delete mode 100755 books/pru-cookbook/02start/code/setup2.sh delete mode 100644 books/pru-cookbook/03details/code/Makefile delete mode 100644 books/pru-cookbook/03details/code/am335x_pru.cmd delete mode 100755 books/pru-cookbook/03details/code/encoder_setup.sh delete mode 100755 books/pru-cookbook/03details/code/gpio_setup.sh delete mode 100755 books/pru-cookbook/03details/code/servos_setup.sh delete mode 100644 books/pru-cookbook/04debug/code/AM335x_PRU.cmd delete mode 100644 books/pru-cookbook/04debug/code/Makefile delete mode 100644 books/pru-cookbook/04debug/code/copyright.c delete mode 100644 books/pru-cookbook/04debug/code/resource_table_empty.h delete mode 100644 books/pru-cookbook/04debug/code/uart1.pru0.c delete mode 100644 books/pru-cookbook/04debug/code/uart1.pru1_0.c delete mode 100644 books/pru-cookbook/04debug/code/uart2.pru0.c delete mode 100644 books/pru-cookbook/04debug/code/uart2.pru1_0.c delete mode 100644 books/pru-cookbook/04debug/code/uart_setup.sh delete mode 100644 books/pru-cookbook/05blocks/code/Makefile delete mode 100644 books/pru-cookbook/05blocks/code/copyright.c delete mode 100644 books/pru-cookbook/05blocks/code/input.pru0.c delete mode 100755 books/pru-cookbook/05blocks/code/input_setup.sh delete mode 100644 books/pru-cookbook/05blocks/code/module/.gitignore delete mode 100644 books/pru-cookbook/05blocks/code/module/Makefile delete mode 100755 books/pru-cookbook/05blocks/code/module/install.sh delete mode 100644 books/pru-cookbook/05blocks/code/module/rpmsg_client_sample.c delete mode 100644 books/pru-cookbook/05blocks/code/module/rpmsg_pru.c delete mode 100755 books/pru-cookbook/05blocks/code/module/setup.sh delete mode 100755 books/pru-cookbook/05blocks/code/neo-colors.py delete mode 100755 books/pru-cookbook/05blocks/code/neo-rainbow.py delete mode 100644 books/pru-cookbook/05blocks/code/neo1.pru0.c delete mode 100644 books/pru-cookbook/05blocks/code/neo1.pru1_1.c delete mode 100644 books/pru-cookbook/05blocks/code/neo2.pru0.c delete mode 100644 books/pru-cookbook/05blocks/code/neo2.pru1_1.c delete mode 100644 books/pru-cookbook/05blocks/code/neo3.pru0.c delete mode 100644 books/pru-cookbook/05blocks/code/neo3.pru1_1.c delete mode 100644 books/pru-cookbook/05blocks/code/neo4.pru0.c delete mode 100644 books/pru-cookbook/05blocks/code/neo4.pru1_1.c delete mode 100755 books/pru-cookbook/05blocks/code/neo_setup.sh delete mode 100644 books/pru-cookbook/05blocks/code/pwm-test.c delete mode 100644 books/pru-cookbook/05blocks/code/pwm1.pru0.c delete mode 100644 books/pru-cookbook/05blocks/code/pwm1.pru1_1.c delete mode 100644 books/pru-cookbook/05blocks/code/pwm2.pru0.c delete mode 100644 books/pru-cookbook/05blocks/code/pwm3.pru0.c delete mode 100644 books/pru-cookbook/05blocks/code/pwm4.pru0.c delete mode 100644 books/pru-cookbook/05blocks/code/pwm5.pru0.c delete mode 100644 books/pru-cookbook/05blocks/code/pwm6.pru0.c delete mode 100644 books/pru-cookbook/05blocks/code/pwm7-test.c delete mode 100644 books/pru-cookbook/05blocks/code/pwm7.pru0.c delete mode 100644 books/pru-cookbook/05blocks/code/pwm7.pru1.c delete mode 100755 books/pru-cookbook/05blocks/code/pwm7_setup.sh delete mode 100644 books/pru-cookbook/05blocks/code/pwm8.pru0.c delete mode 100644 books/pru-cookbook/05blocks/code/pwm8.pru1.c delete mode 100755 books/pru-cookbook/05blocks/code/pwm_setup.sh delete mode 100644 books/pru-cookbook/05blocks/code/resource_table_empty.h delete mode 100644 books/pru-cookbook/05blocks/code/rgb1.pru0.c delete mode 100644 books/pru-cookbook/05blocks/code/rgb2.pru0.c delete mode 100644 books/pru-cookbook/05blocks/code/rgb3.pru0.c delete mode 100644 books/pru-cookbook/05blocks/code/rgb4.pru0.c delete mode 100644 books/pru-cookbook/05blocks/code/rgb_black.h delete mode 100644 books/pru-cookbook/05blocks/code/rgb_pocket.h delete mode 100755 books/pru-cookbook/05blocks/code/rgb_python.py delete mode 100755 books/pru-cookbook/05blocks/code/rgb_python_setup.sh delete mode 100755 books/pru-cookbook/05blocks/code/rgb_setup.sh delete mode 100644 books/pru-cookbook/05blocks/code/rgb_white.pru0.c delete mode 100644 books/pru-cookbook/05blocks/code/shared.pru0.c delete mode 100755 books/pru-cookbook/05blocks/code/shared_setup.sh delete mode 100644 books/pru-cookbook/05blocks/code/sine.map delete mode 100644 books/pru-cookbook/05blocks/code/sine.pru0.c delete mode 100755 books/pru-cookbook/05blocks/code/write_init_pins.sh delete mode 100644 books/pru-cookbook/06io/code/Makefile delete mode 100644 books/pru-cookbook/06io/code/gpio.pru0.c delete mode 100755 books/pru-cookbook/06io/code/setup.sh delete mode 100644 books/pru-cookbook/07more/code/Makefile delete mode 100644 books/pru-cookbook/07more/code/copyright.c delete mode 100644 books/pru-cookbook/07more/code/cycle.pru0.c delete mode 100644 books/pru-cookbook/07more/code/cycle.pru0.lst delete mode 100644 books/pru-cookbook/07more/code/delay-test.pru0.c delete mode 100644 books/pru-cookbook/07more/code/delay-test2.pru0.c delete mode 100644 books/pru-cookbook/07more/code/delay.pru0.asm delete mode 100644 books/pru-cookbook/07more/code/delay2.pru0.asm delete mode 100644 books/pru-cookbook/07more/code/logic.c delete mode 100644 books/pru-cookbook/07more/code/logic_setup.sh delete mode 100644 books/pru-cookbook/07more/code/resource_table_pru0.h delete mode 100644 books/pru-cookbook/07more/code/setup.sh delete mode 100644 books/pru-cookbook/07more/code/xin.pru1.c delete mode 100644 books/pru-cookbook/07more/code/xout-cycle.pru0.c delete mode 100644 books/pru-cookbook/07more/code/xout.pru0.c delete mode 100755 books/pru-cookbook/07more/code/xout_run.sh delete mode 100644 books/pru-cookbook/08ai/code/Makefile delete mode 100644 books/pru-cookbook/08ai/code/pwm1.pru2_1.c create mode 160000 books/pru-cookbook/code diff --git a/.gitmodules b/.gitmodules index 0c170ef1..4d6dbcd6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "books/beaglebone-cookbook/code"] path = books/beaglebone-cookbook/code url = https://git.beagleboard.org/beagleboard/beaglebone-cookbook-code.git +[submodule "books/pru-cookbook/code"] + path = books/pru-cookbook/code + url = https://git.beagleboard.org/beagleboard/pru-cookbook-code diff --git a/boards/beaglebone/ai-64/ch04.rst b/boards/beaglebone/ai-64/ch04.rst index 866f1a78..4ea164d9 100644 --- a/boards/beaglebone/ai-64/ch04.rst +++ b/boards/beaglebone/ai-64/ch04.rst @@ -27,7 +27,7 @@ BeagleBone AI-64 is manufactured and warranted by partners listed at https://bea * Mark Yoder, professor at Rose-Hulman Institute of Technology * Kathy Giori, product engineer at ZEDEDA -See `bbb.io/about <bbb.io/about>`_ +See `bbb.io/about <https://beagleboard.org/about>`_ BeagleBone AI-64 has been designed by Seeed Studio (Seeed Development Limited) under guidance from BeagleBoard.org Foundation. diff --git a/boards/beaglebone/ai-64/ch07.rst b/boards/beaglebone/ai-64/ch07.rst index 81029ee7..64843aaa 100644 --- a/boards/beaglebone/ai-64/ch07.rst +++ b/boards/beaglebone/ai-64/ch07.rst @@ -35,7 +35,7 @@ The **GPIO** row is the expected gpio identifier number in the Linux kernel. Each row includes the gpiochipX and pinY in the format of -`X Y`. You can use these values to direcly control the GPIO pins with the +`X Y`. You can use these values to directly control the GPIO pins with the commands shown below. .. code:: diff --git a/boards/beaglebone/ai-64/ch11.rst b/boards/beaglebone/ai-64/ch11.rst index 3298d419..a458bd15 100644 --- a/boards/beaglebone/ai-64/ch11.rst +++ b/boards/beaglebone/ai-64/ch11.rst @@ -11,7 +11,7 @@ All support for this design is through BeagleBoard.org community at: link: `Beag Hardware Design ------------------ -You can find all BeagleBone AI-64 hardware files `here <https://git.beagleboard.org/beagleboard/beaglebone-ai-64/-/tree/master/hw>`_ . +You can find all BeagleBone AI-64 hardware files `here <https://git.beagleboard.org/beagleboard/beaglebone-ai-64>`_ under the `hw` folder. .. _software-updates: diff --git a/boards/beaglebone/ai/ch12.rst b/boards/beaglebone/ai/ch12.rst index a5700477..b225f981 100644 --- a/boards/beaglebone/ai/ch12.rst +++ b/boards/beaglebone/ai/ch12.rst @@ -30,6 +30,7 @@ the equipment. This Class A or B digital apparatus complies with Canadian ICES-003. Changes or modifications not expressly approved by the party responsible for compliance could void the user’s authority to operate the equipment. + Cet appareil numérique de la classe A ou B est conforme à la norme NMB-003 du Canada. Les changements ou les modifications pas expressément approuvés par la partie responsible de la conformité ont pu vider diff --git a/boards/beaglebone/black/ch07.rst b/boards/beaglebone/black/ch07.rst index de80c32a..57022518 100644 --- a/boards/beaglebone/black/ch07.rst +++ b/boards/beaglebone/black/ch07.rst @@ -1175,7 +1175,11 @@ Serial cable is recommended as shown in *Figure 55* below. The cable can be purchased from several different places and must be the 3.3V version TTL-232R-3V3. Information on the cable itself can be found -direct from FTDI at: `pdf <http://www.ftdichip.com/Support/Documents/DataSheets/Cables/DS_TTL232R_CABLES.pdf>`_ +direct from FTDI at: `pdf <https://ftdichip.com/wp-content/uploads/2020/07/DS_USB_RS232_CABLES.pdf>`_ + +.. note: + + #TODO#: move accessory links to a single common document for all boards. Pin 1 of the cable is the black wire. That must align with the pin 1 on the board which is designated by the white dot next to the connector on @@ -1183,7 +1187,7 @@ the board. Refer to the support WIKI `http://elinux.org/BeagleBoneBlack <http://elinux.org/BeagleBoneBlack>`_ for more sources of this cable and other options that will work. -Table is the pinout of the connector as reflected in the schematic. It is the same as the FTDI cable which can be found at `http://www.ftdichip.com/Support/Documents/DataSheets/Cables/DS_TTL-232R_CABLES.pdf <http://www.ftdichip.com/Support/Documents/DataSheets/Cables/DS_TTL-232R_CABLES.pdf>`_ with the exception that only three pins are used on the board. The pin numbers are defined in *Table 14*. The signals are from the perspective of the board. +Table is the pinout of the connector as reflected in the schematic. It is the same as the FTDI cable which can be found at `https://ftdichip.com/wp-content/uploads/2020/07/DS_USB_RS232_CABLES.pdf <https://ftdichip.com/wp-content/uploads/2020/07/DS_USB_RS232_CABLES.pdf>`_ with the exception that only three pins are used on the board. The pin numbers are defined in *Table 14*. The signals are from the perspective of the board. .. list-table:: J1 Serial Header Pins :header-rows: 1 diff --git a/boards/beaglebone/blue/accessories.rst b/boards/beaglebone/blue/accessories.rst index 9bb37a61..3a44db18 100644 --- a/boards/beaglebone/blue/accessories.rst +++ b/boards/beaglebone/blue/accessories.rst @@ -3,6 +3,10 @@ Accessories ############### +.. note:: + + #TODO#: We are going to work on a unified accessories page for all the boards and it should replace this. + .. _chassis_and_kits: Chassis and kits @@ -251,7 +255,8 @@ I2C devices ============== - See - `One-Liner-Module-Tests#Grove_I2C_modules <One-Liner-Module-Tests#Grove_I2C_modules>`__ + :ref:`One-Liner-Module-Tests#i2c <beaglebone-blue-one-liner-tests>`__ +- See :ref:`bone101_i2c`. .. _uart_devices: diff --git a/boards/beaglebone/blue/tests.rst b/boards/beaglebone/blue/tests.rst index 6b89d828..944b9efe 100644 --- a/boards/beaglebone/blue/tests.rst +++ b/boards/beaglebone/blue/tests.rst @@ -9,7 +9,7 @@ ADC - `Grove Rotary Angle Sensor <http://wiki.seeed.cc/Grove-Rotary_Angle_Sensor/>`__ See output on adc_1 - `source <https://github.com/StrawsonDesign/Robotics_Cape_Installer/blob/master/examples/rc_test_adc/rc_test_adc.c>`__ + `source <https://git.beagleboard.org/beagleboard/librobotcontrol/-/blob/v1.1/examples/src/rc_test_adc.c>`__ .. code:: bash diff --git a/boards/beagleconnect/freedom/zephyr.rst b/boards/beagleconnect/freedom/zephyr.rst index 60ab9573..a9e1dde8 100644 --- a/boards/beagleconnect/freedom/zephyr.rst +++ b/boards/beagleconnect/freedom/zephyr.rst @@ -127,7 +127,7 @@ Other systems Log into BeagleBone Green Gateway ================================= -These instructions assume an x86_64 computer runing Ubuntu 20.04.3 LTS, but any +These instructions assume an x86_64 computer running Ubuntu 20.04.3 LTS, but any computer can be used to connect to your BeagleBone Green Gateway. #. Log onto the Seeed BeagleBone® Green Gateway using :code:`ssh`. diff --git a/boards/pocketbeagle/original/ch06.rst b/boards/pocketbeagle/original/ch06.rst index 39c36f61..e0ee74f7 100644 --- a/boards/pocketbeagle/original/ch06.rst +++ b/boards/pocketbeagle/original/ch06.rst @@ -195,8 +195,7 @@ Additional documentation is located on the Texas Instruments website at and also located at `http://github.com/beagleboard/am335x_pru_package. <http://github.com/beagleboard/am335x_pru_package>`__ -Example projects using the PRU-ICSS can be found at -`processors.wiki.ti.com/index.php/PRU_Projects <http://processors.wiki.ti.com/index.php/PRU_Projects>`__. +Example projects using the PRU-ICSS can be found in :ref:`pru-cookbook-home`. .. _pru_icss_features: @@ -313,4 +312,4 @@ chart separately. | P2.34 | PRU0_5 | C13 | B3 | | | pr1_pru0_pru_r30_5 (Output) | pr1_pru0_pru_r31_5 (Input) | | +-------------+-------------+-----------------+-----------+------------------------------+---------------------------+------------------------------+-------------------------------+----------------------------------------------+ | P2.35 | A5/86 | U5 | F3 | | | pr1_pru1_pru_r30_8 (Output) | pr1_pru1_pru_r31_8 (Input) | | - +-------------+-------------+-----------------+-----------+------------------------------+---------------------------+------------------------------+-------------------------------+----------------------------------------------+ \ No newline at end of file + +-------------+-------------+-----------------+-----------+------------------------------+---------------------------+------------------------------+-------------------------------+----------------------------------------------+ diff --git a/books/beaglebone-cookbook/01basics/basics.rst b/books/beaglebone-cookbook/01basics/basics.rst index 95744e65..2d691dc6 100644 --- a/books/beaglebone-cookbook/01basics/basics.rst +++ b/books/beaglebone-cookbook/01basics/basics.rst @@ -313,7 +313,7 @@ This shows you a list of dates of the most recent Debian images (:ref:`basics_de Latest Debian images At the time of writing, we are using the *Bullseye* image. -Click on it's link. Scrolling up you'll find :ref:`basics_deb2`. +Click on its link. Scrolling up you'll find :ref:`basics_deb2`. There are three types of snapshots, Minimal, IoT and Xfce Desktop. IoT is the one we are running. diff --git a/books/beaglebone-cookbook/02sensors/sensors.rst b/books/beaglebone-cookbook/02sensors/sensors.rst index 79a3bf0e..d957ff08 100644 --- a/books/beaglebone-cookbook/02sensors/sensors.rst +++ b/books/beaglebone-cookbook/02sensors/sensors.rst @@ -684,7 +684,7 @@ tools to test the device. Because these are Linux command-line tools, you have to use *2* as the bus number. *i2cdetect*, shown in :ref:`js_i2cTools`, shows which |I2C| devices are on the bus. The *-r* flag indicates which bus to use. Our TMP101 is appearing at address *0x498*. You can use the *i2cget* command to read -the value. It returns the temperature in hexidecimal and degrees C. +the value. It returns the temperature in hexadecimal and degrees C. In this example, 0x18 = 24{deg}C, which is 75.2{deg}F. (Hmmm, the office is a bit warm today.) Try warming up the TMP101 with your finger and running *i2cget* again. diff --git a/books/beaglebone-cookbook/09capes/capes.rst b/books/beaglebone-cookbook/09capes/capes.rst index 8374b0a9..07b81f1f 100644 --- a/books/beaglebone-cookbook/09capes/capes.rst +++ b/books/beaglebone-cookbook/09capes/capes.rst @@ -796,7 +796,7 @@ and PCB shown in :ref:`capes_miniDisplay_pcb`. PCB for MiniDisplay cape .. note:: - #TODO#: The MiniDisplay cape is not currently available, so this example should be udpated. + #TODO#: The MiniDisplay cape is not currently available, so this example should be updated. A good starting point is to take the PCB layout for the MiniDisplay and edit it for your project. The connectors for +P8+ and +P9+ are already in place and ready to go. @@ -1153,10 +1153,14 @@ Solution --------- Complete capes have an |I2C| EEPROM on board that contains configuration information that is read at boot time. -`Adventures in BeagleBone Cape EEPROMs <http://bit.ly/1Fb64uF>`_ gives a helpful description of two methods for -programming the EEPROM. `How to Roll your own BeagleBone Capes <http://bit.ly/1E5M7RJ>`_ is a good four-part +`Adventures in BeagleBone Cape EEPROMs <https://web.archive.org/web/20190108195421/http://azkeller.com:80/blog/?p=62>`_ gives a helpful description of two methods for +programming the EEPROM. `How to Roll your own BeagleBone Capes <https://web.archive.org/web/20200222204651/http://papermint-designs.com/community/taxonomy/term/68>`_ is a good four-part series on creating a cape, including how to wire and program the EEPROM. +.. note:: + + The current effort to document how to enable software for a cape is ongoing at https://docs.beagleboard.org/latest/boards/capes. + .. _capes_production: Putting Your Cape Design into Production @@ -1172,7 +1176,7 @@ Solution --------- `CircuitHub <https://circuithub.com/>`_ offers a great tool to get a quick quote on assembled PCBs. -To make things simple, I downloaded the `CircuitCo MiniDisplay Cape Eagle design materials <https://elinux.org/Special:Badtitle/NS500:MiniDisplay_Cape>`_ +To make things simple, I downloaded the `CircuitCo MiniDisplay Cape Eagle design materials <https://elinux.org/MiniDisplay_Cape>`_ and uploaded them to CircuitHub. After the design is uploaded, you'll need to review the parts to verify that CircuitHub has or diff --git a/books/beaglebone-cookbook/10parts/parts.rst b/books/beaglebone-cookbook/10parts/parts.rst index a952cf1d..bc445be2 100644 --- a/books/beaglebone-cookbook/10parts/parts.rst +++ b/books/beaglebone-cookbook/10parts/parts.rst @@ -52,8 +52,6 @@ with jumper wires, and <<parts_breadboard>> shows where you can get breadboards. +-------------+--------------------------------------------------------------------------------------------+ | Digikey | http://www.digikey.com/product-detail/en/TW-E012-000/438-1049-ND/643115 | +-------------+--------------------------------------------------------------------------------------------+ - | RadioShack | http://www.radioshack.com/solderless-breadboard-jumper-wire-kit/2760173.html#.VG5i1PnF8fA | - +-------------+--------------------------------------------------------------------------------------------+ | SparkFun | https://www.sparkfun.com/products/124 | +-------------+--------------------------------------------------------------------------------------------+ @@ -73,7 +71,7 @@ with jumper wires, and <<parts_breadboard>> shows where you can get breadboards. +-------------+---------------------------------------------------------------------------------------------------------------------------------------------+ | SparkFun | https://www.sparkfun.com/search/results?term=breadboard | +-------------+---------------------------------------------------------------------------------------------------------------------------------------------+ - | CircuitCo | http://elinux.org/CircuitCo:BeagleBone_Breadboard | + | CircuitCo | https://elinux.org/BeagleBoneBreadboard (no longer manufactured, but design available) | +-------------+---------------------------------------------------------------------------------------------------------------------------------------------+ If you want something more permanent, try `Adafruit's Perma-Proto Breadboard <https://www.adafruit.com/product/1609>`_, laid out like a breadboard. @@ -234,7 +232,3 @@ Here are some things that don't fit in the other categories. | Nokia 5110 LCD | `Adafruit 5110 LCD <http://bit.ly/1Ag6LgG>`_, | | | `SparkFun 5110 LCD <http://bit.ly/19cizdu>`_ | +-----------------------------------------------------+---------------------------------------------------------------------------------------+ - | BeagleBone LCD7 | `eLinux LCD7 <http://elinux.org/CircuitCo:BeagleBone_LCD7#Distributors>`_ | - +-----------------------------------------------------+---------------------------------------------------------------------------------------+ - | MiniDisplay Cape | `eLinux minidisplay <http://elinux.org/CircuitCo:MiniDisplay_Cape>`_ | - +-----------------------------------------------------+---------------------------------------------------------------------------------------+ diff --git a/books/beaglebone-cookbook/code b/books/beaglebone-cookbook/code index 269209bc..e103135d 160000 --- a/books/beaglebone-cookbook/code +++ b/books/beaglebone-cookbook/code @@ -1 +1 @@ -Subproject commit 269209bc64423a06e8caf11b91c7468805b287b2 +Subproject commit e103135d4cd1387e0bfa37b468e3137b9a34e60f diff --git a/books/pru-cookbook/01case/case.rst b/books/pru-cookbook/01case/case.rst index a07cfd58..6cc17c58 100644 --- a/books/pru-cookbook/01case/case.rst +++ b/books/pru-cookbook/01case/case.rst @@ -113,14 +113,14 @@ via the PRU that can be used out of the box. Just run: -.. code-block:: bash +.. code-block:: shell-session bone$ sudo rc_test_servos -f 10 -p 1.5 The ``-f 10`` says to use a frequency of 10 Hz and the ``-p 1.5`` says to set the position to ``1.5``. The range of positions is ``-1.5`` to ``1.5``. Run ``rc_test_servos -h`` to see all the options. -.. code-block:: bash +.. code-block:: shell-session bone$ rc_test_servos -h @@ -229,9 +229,9 @@ Solution The forth encoder can be implemented on the PRU. If you run ``rc_test_encoders_eqep`` on the Blue, you will see the output of encoders E1-E3 which are connected to the eEQP hardware. -.. code-block:: bash +.. code-block:: shell-session - bone$ *rc_test_encoders_eqep* + bone$ rc_test_encoders_eqep Raw encoder positions E1 | E2 | E3 | @@ -288,13 +288,13 @@ Solution The forth encoder is implemented on the PRU and accessed with `sudo rc_test_encoders_pru` .. note:: - This command needs root permission, so the `sudo` is needed. + This command needs root permission, so the `sudo` is needed. The default password is `temppwd`. Here's what you will see -.. code-block:: bash +.. code-block:: shell-session - bone$ *sudo rc_test_encoders_pru* + bone$ sudo rc_test_encoders_pru [sudo] password for debian: Raw encoder position @@ -343,17 +343,17 @@ If you want to be running a newer image, there are instructions on the site for .. _case_installing_beaglelogic: -.. code-block:: bash +.. code-block:: shell-session :caption: Installing BeagleLogic - bone$ *git clone https://github.com/abhishek-kakkar/BeagleLogic* - bone$ *cd BeagleLogic/kernel* - bone$ *mv beaglelogic-00A0.dts beaglelogic-00A0.dts.orig* - bone$ *wget https://gist.githubusercontent.com/abhishek-kakkar/0761ef7b10822cff4b3efd194837f49c/raw/eb2cf6cfb59ff5ccb1710dcd7d4a40cc01cfc050/beaglelogic-00A0.dts* - bone$ *make overlay* - bone$ *sudo cp beaglelogic-00A0.dtbo /lib/firmware/* - bone$ *sudo update-initramfs -u -k \`uname -r`* - bone$ *sudo reboot* + bone$ git clone https://github.com/abhishek-kakkar/BeagleLogic + bone$ cd BeagleLogic/kernel + bone$ mv beaglelogic-00A0.dts beaglelogic-00A0.dts.orig + bone$ wget https://gist.githubusercontent.com/abhishek-kakkar/0761ef7b10822cff4b3efd194837f49c/raw/eb2cf6cfb59ff5ccb1710dcd7d4a40cc01cfc050/beaglelogic-00A0.dts + bone$ make overlay + bone$ sudo cp beaglelogic-00A0.dtbo /lib/firmware/ + bone$ sudo update-initramfs -u -k \`uname -r` + bone$ sudo reboot Once the Bone has rebooted, browse to 192.168.7.2:4000 where you'll see :ref:`case_beaglelogic_capture`. Here you can easily select the sample @@ -386,17 +386,17 @@ logic analyzer on the Bone with no additional hardware needed. The kernel interface makes it easy to control the PRUs through the command line. For example -.. code-block:: bash +.. code-block:: shell-session - bone$ *dd if=/dev/beaglelogic of=mydump bs=1M count=1* + bone$ dd if=/dev/beaglelogic of=mydump bs=1M count=1 will capture a binary dump from the PRUs. The sample rate and number of bits per sample can be controlled through ``/sys/``. -.. code-block:: bash +.. code-block:: shell-session - bone$ *cd /sys/devices/virtual/misc/beaglelogic* - bone$ *ls* + bone$ cd /sys/devices/virtual/misc/beaglelogic + bone$ ls buffers filltestpattern power state uevent bufunitsize lasterror samplerate subsystem dev memalloc sampleunit triggerflags @@ -407,9 +407,9 @@ bits per sample can be controlled through ``/sys/``. You can set the sample rate by simply writing to ``samplerate``. -.. code-block:: bash +.. code-block:: shell-session - bone$ *echo 100000000 > samplerate* + bone$ echo 100000000 > samplerate `sysfs attributes Reference <https://beaglelogic.readthedocs.io/en/latest/sysfs_attributes.html>`_ has more details on configuring via sysfs. @@ -417,9 +417,9 @@ has more details on configuring via sysfs. If you run ``dmesg -Hw`` in another window you can see when a capture is started and stopped. -.. code-block:: bash +.. code-block:: shell-session - bone$ *dmesg -Hw* + bone$ dmesg -Hw [Jul25 08:46] misc beaglelogic: capture started with sample rate=100000000 Hz, sampleunit=1, triggerflags=0 [ +0.086261] misc beaglelogic: capture session ended @@ -583,11 +583,11 @@ explaining how the PRUs get this type of performance. .. _case_e1.31_example: - .. literalinclude:: code/e1.31-test.py + .. literalinclude:: ../code/01start/e1.31-test.py :caption: e1.31-test.py -Example of generating packets to control the NeoPixels :linenos: - :download:`e1.31-test.py <code/e1.31-test.py>` + :download:`e1.31-test.py <../code/01start/e1.31-test.py>` .. TODO document the code @@ -748,10 +748,10 @@ following instructions at https://xlights.org/releases/. Run xLights and you'll see :ref:`case_xlights_setup`. -.. code-block:: bash +.. code-block:: shell-session - host$ *chmod +x xLights-2021.18-x86_64.AppImage* - host$ *./xLights-2021.18-x86_64.AppImage* + host$ chmod +x xLights-2021.18-x86_64.AppImage + host$ ./xLights-2021.18-x86_64.AppImage .. TODO update the figures. @@ -985,7 +985,7 @@ You can `build simpPRU <https://simppru.readthedocs.io/en/latest/install/build/> source, more easily just `install it <https://simppru.readthedocs.io/en/latest/install/install/>`_. On the Beagle run: -.. code-block:: bash +.. code-block:: shell-session bone$ wget https://github.com/VedantParanjape/simpPRU/releases/download/1.4/simppru-1.4-armhf.deb bone$ sudo dpkg -i simppru-1.4-armhf.deb @@ -996,15 +996,15 @@ Now, suppose you wanted to run the `LED blink <https://simppru.readthedocs.io/en/latest/examples/led_blink/>`_ example which is reproduced here. -.. literalinclude:: code/blink.sim +.. literalinclude:: ../code/01start/blink.sim :caption: LED Blink (blink.sim) :linenos: -:download:`blink.sim <code/blink.sim>` +:download:`blink.sim <../code/01start/blink.sim>` Just run simppru -.. code-block:: bash +.. code-block:: shell-session bone$ simppru blink.sim --load Detected TI AM335x PocketBeagle @@ -1019,7 +1019,7 @@ Detected TI AM335x PocketBeagle The +--load+ flag caused the compiled code to be copied to +/lib/firmware+. To start just do: -.. code-block:: bash +.. code-block:: shell-session bone$ cd /dev/remoteproc/pruss-core0/ bone$ ls diff --git a/books/pru-cookbook/01case/code/blink.sim b/books/pru-cookbook/01case/code/blink.sim deleted file mode 100644 index 212a2168..00000000 --- a/books/pru-cookbook/01case/code/blink.sim +++ /dev/null @@ -1,7 +0,0 @@ -/* From: https://simppru.readthedocs.io/en/latest/examples/led_blink/ */ -while : 1 == 1 { - digital_write(P1_31, true); - delay(250); /* Delay 250 ms */ - digital_write(P1_31, false); - delay(250); -} diff --git a/books/pru-cookbook/01case/code/circle.py b/books/pru-cookbook/01case/code/circle.py deleted file mode 100755 index 1feb41cc..00000000 --- a/books/pru-cookbook/01case/code/circle.py +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env python3 - -"""A demo client for Open Pixel Control -http://github.com/zestyping/openpixelcontrol - -Runs an LED around in a circle - -""" - -import time -import opc - -ADDRESS = 'localhost:7890' - -# Create a client object -client = opc.Client(ADDRESS) - -# Test if it can connect -if client.can_connect(): - print('connected to %s' % ADDRESS) -else: - # We could exit here, but instead let's just print a warning - # and then keep trying to send pixels in case the server - # appears later - print('WARNING: could not connect to %s' % ADDRESS) - -# Send pixels forever -STR_LEN=16 -for i in range(STR_LEN): - leds = [(0, 0, 0)] * STR_LEN -leds[0] = (0, 127, 0) - -while True: - tmp = leds[0] - for i in range(STR_LEN-1): - leds[i] = leds[i+1] - leds[-1] = tmp - if client.put_pixels(leds, channel=0): - print('sent') - else: - print('not connected') - time.sleep(0.1) - diff --git a/books/pru-cookbook/01case/code/e1.31-test.py b/books/pru-cookbook/01case/code/e1.31-test.py deleted file mode 100755 index 6016c9eb..00000000 --- a/books/pru-cookbook/01case/code/e1.31-test.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env python3 -# Controls a NeoPixel (WS2812) string via E1.31 and FPP -# https://pypi.org/project/sacn/ -# https://github.com/FalconChristmas/fpp/releases -import sacn -import time - -# provide an IP-Address to bind to if you are using Windows and want to use multicast -sender = sacn.sACNsender("192.168.7.1") -sender.start() # start the sending thread -sender.activate_output(1) # start sending out data in the 1st universe -sender[1].multicast = False # set multicast to True -sender[1].destination = "192.168.7.2" # or provide unicast information. -sender.manual_flush = True # turning off the automatic sending of packets -# Keep in mind that if multicast is on, unicast is not used -LEDcount = 24 -# Have green fade is as it goes -data = [] -for i in range(LEDcount): - data.append(0) # Red - data.append(i) # Green - data.append(0) # Blue -sender[1].dmx_data = data -sender.flush() -time.sleep(0.5) - -# Turn off all LEDs -data=[] -for i in range(3*LEDcount): - data.append(0) -sender.flush() -sender[1].dmx_data = data -time.sleep(0.5) - -# Have red fade in -data = [] -for i in range(LEDcount): - data.append(i) - data.append(0) - data.append(0) -sender[1].dmx_data = data -sender.flush() -time.sleep(0.25) - -# Make LED circle 5 times -for j in range(15): - for i in range(LEDcount-1): - data[3*i+0] = 0 - data[3*i+1] = 0 - data[3*i+2] = 0 - data[3*i+3] = 0 - data[3*i+4] = 64 - data[3*i+5] = 0 - sender[1].dmx_data = data - sender.flush() - time.sleep(0.02) -# Wrap around - i = LEDcount-1 - data[0] = 0 - data[1] = 64 - data[2] = 0 - data[3*i+0] = 0 - data[3*i+1] = 0 - data[3*i+2] = 0 - sender[1].dmx_data = data - sender.flush() - time.sleep(0.02) - -time.sleep(2) # send the data for 10 seconds -sender.stop() # do not forget to stop the sender diff --git a/books/pru-cookbook/01case/code/encoder_setup.sh b/books/pru-cookbook/01case/code/encoder_setup.sh deleted file mode 100755 index ffc4ad68..00000000 --- a/books/pru-cookbook/01case/code/encoder_setup.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash -# Configure the pins based on which Beagle is running -machine=$(awk '{print $NF}' /proc/device-tree/model) -echo -n $machine - -# Configure eQEP pins -if [ $machine = "Black" ]; then - echo " Found" - pins="P9_92 P9_27 P8_35 P8_33 P8_12 P8_11 P8_41 P8_42" -elif [ $machine = "Blue" ]; then - echo " Found" - pins="" -elif [ $machine = "PocketBeagle" ]; then - echo " Found" - pins="P1_31 P2_34 P2_10 P2_24 P2_33" -else - echo " Not Found" - pins="" -fi - -for pin in $pins -do - echo $pin - config-pin $pin qep - config-pin -q $pin -done - -########################################## -# Configure PRU pins -if [ $machine = "Black" ]; then - echo " Found" - pins="P8_16 P8_15" -elif [ $machine = "Blue" ]; then - echo " Found" - pins="" -elif [ $machine = "PocketBeagle" ]; then - echo " Found" - pins="P2_09 P2_18" -else - echo " Not Found" - pins="" -fi - -for pin in $pins -do - echo $pin - config-pin $pin pruin - config-pin -q $pin -done diff --git a/books/pru-cookbook/01case/code/fire.fseq b/books/pru-cookbook/01case/code/fire.fseq deleted file mode 100644 index 4bad5ae76476a87bb7bb71e853e3412b1fc63f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 614428 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%0Dx5r6{zeP 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 Lc7CuLTlW6|<qhqc diff --git a/books/pru-cookbook/01case/code/logic_install.sh b/books/pru-cookbook/01case/code/logic_install.sh deleted file mode 100644 index 7fb76122..00000000 --- a/books/pru-cookbook/01case/code/logic_install.sh +++ /dev/null @@ -1,34 +0,0 @@ -# Instructions for installing BeagleLogic -# https://beaglelogic.readthedocs.io/en/latest/index.html -# From: https://github.com/abhishek-kakkar/BeagleLogic/wiki - -# beaglelogic is installed on the 4.9 kernel, but not the 4.14, so -# if you are running 4.14, switch to 4.9 -sudo /opt/scripts/tools/update_kernel.sh --lts-4_9 -sudo reboot - -git clone https://github.com/abhishek-kakkar/BeagleLogic -cd BeagleLogic -sudo ./install.sh -sudo reboot - -# Now the kernel driver headers -sudo apt install linux-headers-`uname -r` - -modinfo beaglelogic -modprobe beaglelogic - -# From: https://beaglelogic.readthedocs.io/en/latest - -# Here's what works from abhishek -git clone https://github.com/abhishek-kakkar/BeagleLogic -cd BeagleLogic -# 1. Get the dts file from this gist (https://gist.github.com/abhishek-kakkar/0761ef7b10822cff4b3efd194837f49c) - -# 2. cd to 'BeagleLogic/kernel' directory. Put the dts file there. (edited) -# 3. Run 'make overlay' -# 4. Run 'sudo cp -v beaglelogic-00A0.dtbo /lib/firmware/' (edited) -# 5. Run 'sudo update-initramfs -u -k ``uname -r``' (edited) -# (single backticks only, apparently Slack treats single backtick as code) (edited) -# 6. Reboot -# 7. Browse to bone:4000 diff --git a/books/pru-cookbook/01case/code/main_pru1.c b/books/pru-cookbook/01case/code/main_pru1.c deleted file mode 100644 index 2216a9ed..00000000 --- a/books/pru-cookbook/01case/code/main_pru1.c +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Source Modified by Zubeen Tolani < ZeekHuge - zeekhuge@gmail.com > - * Based on the examples distributed by TI - * - * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ - * - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Texas Instruments Incorporated nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_pru1.h" - -// The function is defined in pru1_asm_blinky.asm in same dir -// We just need to add a declaration here, the definition can be -// separately linked -extern void start(void); - -void main(void) -{ - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - start(); -} - diff --git a/books/pru-cookbook/01case/code/my-config.json b/books/pru-cookbook/01case/code/my-config.json deleted file mode 100644 index d1534cff..00000000 --- a/books/pru-cookbook/01case/code/my-config.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "outputMode": "ws281x", - "outputMapping": "original-ledscape", - "demoMode": "fade", - "ledsPerStrip": 16, - "usedStripCount": 1, - "colorChannelOrder": "BRG", - "opcTcpPort": 7890, - "opcUdpPort": 7890, - "enableInterpolation": false, - "enableDithering": false, - "enableLookupTable": true, - "lumCurvePower": 2.0000, - "whitePoint": { - "red": 0.9000, - "green": 1.0000, - "blue": 1.0000 - } -} diff --git a/books/pru-cookbook/01case/code/opc.py b/books/pru-cookbook/01case/code/opc.py deleted file mode 100755 index 36a3bbd6..00000000 --- a/books/pru-cookbook/01case/code/opc.py +++ /dev/null @@ -1,177 +0,0 @@ -#!/usr/bin/env python - -"""Python Client library for Open Pixel Control -http://github.com/zestyping/openpixelcontrol - -Sends pixel values to an Open Pixel Control server to be displayed. -http://openpixelcontrol.org/ - -Recommended use: - - import opc - - # Create a client object - client = opc.Client('localhost:7890') - - # Test if it can connect (optional) - if client.can_connect(): - print('connected to %s' % ADDRESS) - else: - # We could exit here, but instead let's just print a warning - # and then keep trying to send pixels in case the server - # appears later - print('WARNING: could not connect to %s' % ADDRESS) - - # Send pixels forever at 30 frames per second - while True: - my_pixels = [(255, 0, 0), (0, 255, 0), (0, 0, 255)] - if client.put_pixels(my_pixels, channel=0): - print('...') - else: - print('not connected') - time.sleep(1/30.0) - -""" - -import socket -import struct -import sys - -SET_PIXEL_COLOURS = 0 # "Set pixel colours" command (see openpixelcontrol.org) - - -class Client(object): - def __init__(self, server_ip_port, long_connection=True, verbose=False): - """Create an OPC client object which sends pixels to an OPC server. - - server_ip_port should be an ip:port or hostname:port as a single string. - For example: '127.0.0.1:7890' or 'localhost:7890' - - There are two connection modes: - * In long connection mode, we try to maintain a single long-lived - connection to the server. If that connection is lost we will try to - create a new one whenever put_pixels is called. This mode is best - when there's high latency or very high framerates. - * In short connection mode, we open a connection when it's needed and - close it immediately after. This means creating a connection for each - call to put_pixels. Keeping the connection usually closed makes it - possible for others to also connect to the server. - - A connection is not established during __init__. To check if a - connection will succeed, use can_connect(). - - If verbose is True, the client will print debugging info to the console. - - """ - self.verbose = verbose - - self._long_connection = long_connection - - self._ip, self._port = server_ip_port.split(':') - self._port = int(self._port) - - self._socket = None # will be None when we're not connected - - def _debug(self, m): - if self.verbose: - print(' %s' % str(m)) - - def _ensure_connected(self): - """Set up a connection if one doesn't already exist. - - Return True on success or False on failure. - - """ - if self._socket: - self._debug('_ensure_connected: already connected, doing nothing') - return True - - try: - self._debug('_ensure_connected: trying to connect...') - self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self._socket.settimeout(1) - self._socket.connect((self._ip, self._port)) - self._debug('_ensure_connected: ...success') - return True - except socket.error: - self._debug('_ensure_connected: ...failure') - self._socket = None - return False - - def disconnect(self): - """Drop the connection to the server, if there is one.""" - self._debug('disconnecting') - if self._socket: - self._socket.close() - self._socket = None - - def can_connect(self): - """Try to connect to the server. - - Return True on success or False on failure. - - If in long connection mode, this connection will be kept and re-used for - subsequent put_pixels calls. - - """ - success = self._ensure_connected() - if not self._long_connection: - self.disconnect() - return success - - def put_pixels(self, pixels, channel=0): - """Send the list of pixel colors to the OPC server on the given channel. - - channel: Which strand of lights to send the pixel colors to. - Must be an int in the range 0-255 inclusive. - 0 is a special value which means "all channels". - - pixels: A list of 3-tuples representing rgb colors. - Each value in the tuple should be in the range 0-255 inclusive. - For example: [(255, 255, 255), (0, 0, 0), (127, 0, 0)] - Floats will be rounded down to integers. - Values outside the legal range will be clamped. - - Will establish a connection to the server as needed. - - On successful transmission of pixels, return True. - On failure (bad connection), return False. - - The list of pixel colors will be applied to the LED string starting - with the first LED. It's not possible to send a color just to one - LED at a time (unless it's the first one). - - """ - self._debug('put_pixels: connecting') - is_connected = self._ensure_connected() - if not is_connected: - self._debug('put_pixels: not connected. ignoring these pixels.') - return False - - # build OPC message - command = SET_PIXEL_COLOURS - header = struct.pack('>BBH', channel, SET_PIXEL_COLOURS, len(pixels)*3) - pieces = [struct.pack( - 'BBB', - min(255, max(0, int(r))), - min(255, max(0, int(g))), - min(255, max(0, int(b))) - ) for r, g, b in pixels] - if bytes is str: - message = header + ''.join(pieces) - else: - message = header + b''.join(pieces) - - self._debug('put_pixels: sending pixels to server') - try: - self._socket.send(message) - except socket.error: - self._debug('put_pixels: connection lost. could not send pixels.') - self._socket = None - return False - - if not self._long_connection: - self._debug('put_pixels: disconnecting') - self.disconnect() - - return True diff --git a/books/pru-cookbook/01case/code/pru1-servo.asm b/books/pru-cookbook/01case/code/pru1-servo.asm deleted file mode 100644 index c8e66e52..00000000 --- a/books/pru-cookbook/01case/code/pru1-servo.asm +++ /dev/null @@ -1,162 +0,0 @@ -;* -;* Copyright (C) 2016 Zubeen Tolani <ZeekHuge - zeekhuge@gmail.com> -;* -;* This file is as an example to show how to develope -;* and compile inline assembly code for PRUs -;* -;* This program is free software; you can redistribute it and/or modify -;* it under the terms of the GNU General Public License version 2 as -;* published by the Free Software Foundation. - - - .cdecls "main_pru1.c" - -DELAY .macro time, reg - LDI32 reg, time - QBEQ $E?, reg, 0 -$M?: SUB reg, reg, 1 - QBNE $M?, reg, 0 -$E?: - .endm - - - .clink - .global start -start: - LDI R30, 0xFFFF - DELAY 10000000, r11 - LDI R30, 0x0000 - DELAY 10000000, r11 -; JMP start - -; HALT - - -; these pin definitions are specific to SD-101C Robotics Cape - .asg r30.t8, CH1BIT ; P8_27 - .asg r30.t10, CH2BIT ; P8_28 - .asg r30.t9, CH3BIT ; P8_29 - .asg r30.t11, CH4BIT ; P8_30 - .asg r30.t6, CH5BIT ; P8_39 - .asg r30.t7, CH6BIT ; P8_40 - .asg r30.t4, CH7BIT ; P8_41 - .asg r30.t5, CH8BIT ; P8_42 - - .asg C4, CONST_SYSCFG - .asg C28, CONST_PRUSHAREDRAM - - .asg 0x22000, PRU0_CTRL - .asg 0x24000, PRU1_CTRL ; page 19 - .asg 0x28, CTPPR0 ; page 75 - - .asg 0x000, OWN_RAM - .asg 0x020, OTHER_RAM - .asg 0x100, SHARED_RAM ; This is so prudebug can find it. - - LBCO &r0, CONST_SYSCFG, 4, 4 ; Enable OCP master port - CLR r0, r0, 4 ; Clear SYSCFG[STANDBY_INIT] to enable OCP master port - SBCO &r0, CONST_SYSCFG, 4, 4 - -; Configure the programmable pointer register for PRU0 by setting c28_pointer[15:0] - LDI r0, SHARED_RAM ; Set C28 to point to shared RAM - LDI32 r1, PRU1_CTRL + CTPPR0 ; Note we use beginning of shared ram unlike example which - SBBO &r0, r1, 0, 4 ; page 25 - - LDI r9, 0x0 ; erase r9 to use to use later - - LDI r0, 0x0 ; clear internal counters - LDI r1, 0x0 - LDI r2, 0x0 - LDI r3, 0x0 - LDI r4, 0x0 - LDI r5, 0x0 - LDI r6, 0x0 - LDI32 r7, 0x0 - LDI r30, 0x0 ; turn off GPIO outputs - - -; Beginning of loop, should always take 48 instructions to complete -CH1: - QBEQ CLR1, r0, 0 ; If timer is 0, jump to clear channel - SET r30, CH1BIT ; If non-zero turn on the corresponding channel - SUB r0, r0, 1 ; Subtract one from timer - CLR r9, r9.t1 ; waste a cycle for timing - SBCO &r9, CONST_PRUSHAREDRAM, 0, 4 ; write 0 to shared memory -CH2: - QBEQ CLR2, r1, 0 - SET r30, CH2BIT - SUB r1, r1, 1 - CLR r9, r9.t1 - SBCO &r9, CONST_PRUSHAREDRAM, 4, 4 -CH3: - QBEQ CLR3, r2, 0 - SET r30, CH3BIT - SUB r2, r2, 1 - CLR r9, r9.t1 - SBCO &r9, CONST_PRUSHAREDRAM, 8, 4 -CH4: - QBEQ CLR4, r3, 0 - SET r30, CH4BIT - SUB r3, r3, 1 - CLR r9, r9.t1 - SBCO &r9, CONST_PRUSHAREDRAM, 12, 4 -CH5: - QBEQ CLR5, r4, 0 - SET r30, CH5BIT - SUB r4, r4, 1 - CLR r9, r9.t1 - SBCO &r9, CONST_PRUSHAREDRAM, 16, 4 -CH6: - QBEQ CLR6, r5, 0 - SET r30, CH6BIT - SUB r5, r5, 1 - CLR r9, r9.t1 - SBCO &r9, CONST_PRUSHAREDRAM, 20, 4 -CH7: - QBEQ CLR7, r6, 0 - SET r30, CH7BIT - SUB r6, r6, 1 - CLR r9, r9.t1 - SBCO &r9, CONST_PRUSHAREDRAM, 24, 4 -CH8: - QBEQ CLR8, r7, 0 - SET r30, CH8BIT - SUB r7, r7, 1 - SBCO &r9, CONST_PRUSHAREDRAM, 28, 4 - - QBA CH1 ; return to beginning of loop - ; no need to waste a cycle for timing here because of the QBA above - - -CLR1: - CLR r30, CH1BIT ; turn off the corresponding channel - LBCO &r0, CONST_PRUSHAREDRAM, 0, 4 ; Load new timer register - QBA CH2 -CLR2: - CLR r30, CH2BIT - LBCO &r1, CONST_PRUSHAREDRAM, 4, 4 - QBA CH3 -CLR3: - CLR r30, CH3BIT - LBCO &r2, CONST_PRUSHAREDRAM, 8, 4 - QBA CH4 -CLR4: - CLR r30, CH4BIT - LBCO &r3, CONST_PRUSHAREDRAM, 12, 4 - QBA CH5 -CLR5: - CLR r30, CH5BIT - LBCO &r4, CONST_PRUSHAREDRAM, 16, 4 - QBA CH6 -CLR6: - CLR r30, CH6BIT - LBCO &r5, CONST_PRUSHAREDRAM, 20, 4 - QBA CH7 -CLR7: - CLR r30, CH7BIT - LBCO &r6, CONST_PRUSHAREDRAM, 24, 4 - QBA CH8 -CLR8: - CLR r30, CH8BIT - LBCO &r7, CONST_PRUSHAREDRAM, 28, 4 - QBA CH1 ; return to beginning of loop diff --git a/books/pru-cookbook/01case/code/servo-test.c b/books/pru-cookbook/01case/code/servo-test.c deleted file mode 100644 index 1f94e274..00000000 --- a/books/pru-cookbook/01case/code/servo-test.c +++ /dev/null @@ -1,84 +0,0 @@ -/* - * - * servo tester - * (c) Copyright 2016 - * Mark A. Yoder, 20-July-2016 - * - */ - -#include <stdio.h> -#include <fcntl.h> -#include <sys/mman.h> -#include "robotics_cape_defs.h" - -#define PRU_ADDR 0x4A300000 // Start of PRU memory Page 184 am335x TRM -#define PRU_LEN 0x80000 // Length of PRU memory -#define PRU_SHAREDMEM 0x10000 // Offset to shared memory - -unsigned int *prusharedMem_32int_ptr; // Points to the start of the shared memory - -/******************************************************************************* -* int send_servo_pulse_us(int ch, int us) -* -* Sends a single pulse of duration us (microseconds) to a single channel (ch) -*******************************************************************************/ -int send_servo_pulse_us(int ch, int us) { - // Sanity Checks - if(ch<1 || ch>SERVO_CHANNELS){ - printf("ERROR: Servo Channel must be between 1&%d\n", SERVO_CHANNELS); - return -1; - } if(prusharedMem_32int_ptr == NULL){ - printf("ERROR: PRU servo Controller not initialized\n"); - return -1; - } - // PRU runs at 200Mhz. find #loops needed - unsigned int num_loops = ((us*200.0)/PRU_SERVO_LOOP_INSTRUCTIONS); - // printf("num_loops: %d\n", num_loops); - // write to PRU shared memory - prusharedMem_32int_ptr[ch-1] = num_loops; - return 0; -} - -int main(int argc, char *argv[]) -{ - unsigned int *pru; // Points to start of PRU memory. - int fd; - printf("Servo tester\n"); - - fd = open ("/dev/mem", O_RDWR | O_SYNC); - if (fd == -1) { - printf ("ERROR: could not open /dev/mem.\n\n"); - return 1; - } - pru = mmap (0, PRU_LEN, PROT_READ | PROT_WRITE, MAP_SHARED, fd, PRU_ADDR); - if (pru == MAP_FAILED) { - printf ("ERROR: could not map memory.\n\n"); - return 1; - } - close(fd); - printf ("Using /dev/mem.\n"); - - prusharedMem_32int_ptr = pru + PRU_SHAREDMEM/4; // Points to start of shared memory - - // while(1) { - // printf("value to store: "); - // scanf("%d", &value); - // printf("Storing: %d in %lx\n", value, addr); - // pru[addr/4] = value; - // } - - int i; - while(1) { - for(i=1; i<=SERVO_CHANNELS; i++) { - send_servo_pulse_us(i, 10*i); - } - usleep(200); - } - - if(munmap(pru, PRU_LEN)) { - printf("munmap failed\n"); - } else { - printf("munmap succeeded\n"); - } -} - diff --git a/books/pru-cookbook/01case/code/servos_setup.sh b/books/pru-cookbook/01case/code/servos_setup.sh deleted file mode 100755 index 330e8f34..00000000 --- a/books/pru-cookbook/01case/code/servos_setup.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -# Configure the PRU pins based on which Beagle is running -machine=$(awk '{print $NF}' /proc/device-tree/model) -echo -n $machine -if [ $machine = "Black" ]; then - echo " Found" - pins="P8_27 P8_28 P8_29 P8_30 P8_39 P8_40 P8_41 P8_42" -elif [ $machine = "Blue" ]; then - echo " Found" - pins="" -elif [ $machine = "PocketBeagle" ]; then - echo " Found" - pins="P2_35 P1_35 P1_02 P1_04" -else - echo " Not Found" - pins="" -fi - -for pin in $pins -do - echo $pin - config-pin $pin pruout - config-pin -q $pin -done \ No newline at end of file diff --git a/books/pru-cookbook/02start/code/Makefile b/books/pru-cookbook/02start/code/Makefile deleted file mode 100644 index a7557fda..00000000 --- a/books/pru-cookbook/02start/code/Makefile +++ /dev/null @@ -1 +0,0 @@ -include /var/lib/cloud9/common/Makefile diff --git a/books/pru-cookbook/02start/code/ai.notes b/books/pru-cookbook/02start/code/ai.notes deleted file mode 100644 index d11ac1d4..00000000 --- a/books/pru-cookbook/02start/code/ai.notes +++ /dev/null @@ -1,59 +0,0 @@ -Here are some differences between the AI and the Black for the PRU. - -Black -/sys/devices/platform/ocp/ - 4a326004.pruss-soc-bus/ - 4a300000.pruss/ - 4a334000.pru/remoteproc/remoteproc1 - 4a338000.pru/remoteproc/remoteproc2 - - -AI -/sys/devices/platform/44000000.ocp/ - 4b226004.pruss-soc-bus/ - 4b200000.pruss/ - 4b234000.pru/remoteproc/remoteproc0 - 4b238000.pru/remoteproc/remoteproc1 - - - 4b2a6004.pruss-soc-bus/ - 4b280000.pruss/ - 4b2b4000.pru/remoteproc/remoteproc2 - 4b2b8000.pru/remoteproc/remoteproc3 - -LED addresses -https://github.com/beagleboard/BeagleBoard-DeviceTrees/blob/v4.19.x-ti/src/arm/am5729-beagleboneai.dts#L134-L171 - led0 { - label = "beaglebone:green:usr0"; - gpios = <&gpio3 17 GPIO_ACTIVE_HIGH>; - linux,default-trigger = "heartbeat"; - default-state = "off"; - }; - - led1 { - label = "beaglebone:green:usr1"; - gpios = <&gpio5 5 GPIO_ACTIVE_HIGH>; - linux,default-trigger = "mmc0"; - default-state = "off"; - }; - - led2 { - label = "beaglebone:green:usr2"; - gpios = <&gpio3 15 GPIO_ACTIVE_HIGH>; - linux,default-trigger = "cpu"; - default-state = "off"; - }; - - led3 { - label = "beaglebone:green:usr3"; - gpios = <&gpio3 14 GPIO_ACTIVE_HIGH>; - linux,default-trigger = "mmc1"; - default-state = "off"; - }; - - led4 { - label = "beaglebone:green:usr4"; - gpios = <&gpio3 7 GPIO_ACTIVE_HIGH>; - linux,default-trigger = "phy0assoc"; - -GPIO Addresses: Page 404 for TRM \ No newline at end of file diff --git a/books/pru-cookbook/02start/code/hello.pru0.c b/books/pru-cookbook/02start/code/hello.pru0.c deleted file mode 100644 index 239a7ad0..00000000 --- a/books/pru-cookbook/02start/code/hello.pru0.c +++ /dev/null @@ -1,35 +0,0 @@ -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" - -volatile register unsigned int __R30; -volatile register unsigned int __R31; - -void main(void) { - int i; - - uint32_t *gpio1 = (uint32_t *)GPIO1; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - for(i=0; i<10; i++) { - gpio1[GPIO_SETDATAOUT] = USR3; // the USR3 LED on - - __delay_cycles(500000000/5); // Wait 1/2 second - - gpio1[GPIO_CLEARDATAOUT] = USR3; - - __delay_cycles(500000000/5); - - } - __halt(); -} - -// Turns off triggers -#pragma DATA_SECTION(init_pins, ".init_pins") -#pragma RETAIN(init_pins) -const char init_pins[] = - "/sys/class/leds/beaglebone:green:usr3/trigger\0none\0" \ - "\0\0"; diff --git a/books/pru-cookbook/02start/code/hello.pru1_1.c b/books/pru-cookbook/02start/code/hello.pru1_1.c deleted file mode 100644 index 51a1b351..00000000 --- a/books/pru-cookbook/02start/code/hello.pru1_1.c +++ /dev/null @@ -1,35 +0,0 @@ -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" - -volatile register unsigned int __R30; -volatile register unsigned int __R31; - -void main(void) { - int i; - - uint32_t *gpio3 = (uint32_t *)GPIO3; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - for(i=0; i<10; i++) { - gpio3[GPIO_SETDATAOUT] = USR3; // the USR3 LED on - - __delay_cycles(500000000/5); // Wait 1/2 second - - gpio3[GPIO_CLEARDATAOUT] = USR3; - - __delay_cycles(500000000/5); - - } - __halt(); -} - -// Turns off triggers -#pragma DATA_SECTION(init_pins, ".init_pins") -#pragma RETAIN(init_pins) -const char init_pins[] = - "/sys/class/leds/beaglebone:green:usr3/trigger\0none\0" \ - "\0\0"; diff --git a/books/pru-cookbook/02start/code/hello2.pru0.c b/books/pru-cookbook/02start/code/hello2.pru0.c deleted file mode 100644 index a9be0143..00000000 --- a/books/pru-cookbook/02start/code/hello2.pru0.c +++ /dev/null @@ -1,42 +0,0 @@ -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" - -volatile register unsigned int __R30; -volatile register unsigned int __R31; - -void main(void) { - int i; - - uint32_t *gpio1 = (uint32_t *)GPIO1; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - for(i=0; i<10; i++) { - gpio1[GPIO_SETDATAOUT] = USR1; // the USR3 LED on - gpio1[GPIO_CLEARDATAOUT] = USR2; - - // __R30 |= gpio; // Set the GPIO pin to 1 - - __delay_cycles(500000000/5); // Wait 1/2 second - - gpio1[GPIO_CLEARDATAOUT] = USR1; - gpio1[GPIO_SETDATAOUT] = USR2; - - // __R30 &= ~gpio; // Clearn the GPIO pin - - __delay_cycles(500000000/5); - - } - __halt(); -} - -// Turns off triggers -#pragma DATA_SECTION(init_pins, ".init_pins") -#pragma RETAIN(init_pins) -const char init_pins[] = - "/sys/class/leds/beaglebone:green:usr1/trigger\0none\0" \ - "/sys/class/leds/beaglebone:green:usr2/trigger\0none\0" \ - "\0\0"; diff --git a/books/pru-cookbook/02start/code/hello2.pru1.c b/books/pru-cookbook/02start/code/hello2.pru1.c deleted file mode 100644 index c3455870..00000000 --- a/books/pru-cookbook/02start/code/hello2.pru1.c +++ /dev/null @@ -1,43 +0,0 @@ -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" - -volatile register unsigned int __R30; -volatile register unsigned int __R31; - -void main(void) { - int i; - - uint32_t *gpio1 = (uint32_t *)GPIO1; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - for(i=0; i<10; i++) { - gpio1[GPIO_SETDATAOUT] = USR1; // the USR3 LED on - gpio1[GPIO_CLEARDATAOUT] = USR2; - - // __R30 |= gpio; // Set the GPIO pin to 1 - - __delay_cycles(500000000/5); // Wait 1/2 second - - gpio1[GPIO_CLEARDATAOUT] = USR1; - gpio1[GPIO_SETDATAOUT] = USR2; - - // __R30 &= ~gpio; // Clearn the GPIO pin - - __delay_cycles(500000000/5); - - } - __halt(); -} - -// Turns off triggers -#pragma DATA_SECTION(init_pins, ".init_pins") -#pragma RETAIN(init_pins) -const char init_pins[] = - "/sys/class/leds/beaglebone:green:usr1/trigger\0none\0" \ - "/sys/class/leds/beaglebone:green:usr2/trigger\0none\0" \ - "\0\0"; - diff --git a/books/pru-cookbook/02start/code/hello2.pru1_0.c b/books/pru-cookbook/02start/code/hello2.pru1_0.c deleted file mode 100644 index 564e1bc9..00000000 --- a/books/pru-cookbook/02start/code/hello2.pru1_0.c +++ /dev/null @@ -1,63 +0,0 @@ -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" - -volatile register unsigned int __R30; -volatile register unsigned int __R31; - -void main(void) { - int i; - - // uint32_t *gpio1 = (uint32_t *)GPIO1; - // uint32_t *gpio2 = (uint32_t *)GPIO2; - uint32_t *gpio3 = (uint32_t *)GPIO3; - // uint32_t *gpio4 = (uint32_t *)GPIO4; - uint32_t *gpio5 = (uint32_t *)GPIO5; - uint32_t *gpio6 = (uint32_t *)GPIO6; - // uint32_t *gpio7 = (uint32_t *)GPIO7; - uint32_t *gpio8 = (uint32_t *)GPIO8; - - // Select which pins to toggle. These are all on pru1_1 - uint32_t gpio = P9_16 | P8_15 | P8_16 | P8_26; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - for(i=0; i<100; i++) { - gpio5[GPIO_SETDATAOUT] = USR1; // Turn the USR1 LED on - gpio3[GPIO_CLEARDATAOUT] = USR2; - gpio8[GPIO_SETDATAOUT] = P8_17; - gpio6[GPIO_SETDATAOUT] = P9_25; - - __R30 |= gpio; // Set the GPIO pin to 1 - - __delay_cycles(500000000/5); // Wait 1/2 second - - gpio5[GPIO_CLEARDATAOUT] = USR1; - gpio3[GPIO_SETDATAOUT] = USR2; - gpio8[GPIO_CLEARDATAOUT] = P8_17; - gpio6[GPIO_CLEARDATAOUT] = P9_25; - - __R30 &= ~gpio; // Clear the GPIO pin - - __delay_cycles(500000000/5); - - if((__R31&P8_19) == P8_19) { - gpio3[GPIO_CLEARDATAOUT] = USR3; // Turn on LED - } else - gpio3[GPIO_SETDATAOUT] = USR3; // Turn off LED - } - __halt(); -} - -// Turns off triggers -#pragma DATA_SECTION(init_pins, ".init_pins") -#pragma RETAIN(init_pins) -const char init_pins[] = - "/sys/class/leds/beaglebone:green:usr1/trigger\0none\0" \ - "/sys/class/leds/beaglebone:green:usr2/trigger\0none\0" \ - "/sys/class/gpio/export\0 177\0" \ - "/sys/class/gpio/gpio177/direction\0out\0" \ - "\0\0"; - diff --git a/books/pru-cookbook/02start/code/hello2.pru1_1.c b/books/pru-cookbook/02start/code/hello2.pru1_1.c deleted file mode 100644 index 564e1bc9..00000000 --- a/books/pru-cookbook/02start/code/hello2.pru1_1.c +++ /dev/null @@ -1,63 +0,0 @@ -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" - -volatile register unsigned int __R30; -volatile register unsigned int __R31; - -void main(void) { - int i; - - // uint32_t *gpio1 = (uint32_t *)GPIO1; - // uint32_t *gpio2 = (uint32_t *)GPIO2; - uint32_t *gpio3 = (uint32_t *)GPIO3; - // uint32_t *gpio4 = (uint32_t *)GPIO4; - uint32_t *gpio5 = (uint32_t *)GPIO5; - uint32_t *gpio6 = (uint32_t *)GPIO6; - // uint32_t *gpio7 = (uint32_t *)GPIO7; - uint32_t *gpio8 = (uint32_t *)GPIO8; - - // Select which pins to toggle. These are all on pru1_1 - uint32_t gpio = P9_16 | P8_15 | P8_16 | P8_26; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - for(i=0; i<100; i++) { - gpio5[GPIO_SETDATAOUT] = USR1; // Turn the USR1 LED on - gpio3[GPIO_CLEARDATAOUT] = USR2; - gpio8[GPIO_SETDATAOUT] = P8_17; - gpio6[GPIO_SETDATAOUT] = P9_25; - - __R30 |= gpio; // Set the GPIO pin to 1 - - __delay_cycles(500000000/5); // Wait 1/2 second - - gpio5[GPIO_CLEARDATAOUT] = USR1; - gpio3[GPIO_SETDATAOUT] = USR2; - gpio8[GPIO_CLEARDATAOUT] = P8_17; - gpio6[GPIO_CLEARDATAOUT] = P9_25; - - __R30 &= ~gpio; // Clear the GPIO pin - - __delay_cycles(500000000/5); - - if((__R31&P8_19) == P8_19) { - gpio3[GPIO_CLEARDATAOUT] = USR3; // Turn on LED - } else - gpio3[GPIO_SETDATAOUT] = USR3; // Turn off LED - } - __halt(); -} - -// Turns off triggers -#pragma DATA_SECTION(init_pins, ".init_pins") -#pragma RETAIN(init_pins) -const char init_pins[] = - "/sys/class/leds/beaglebone:green:usr1/trigger\0none\0" \ - "/sys/class/leds/beaglebone:green:usr2/trigger\0none\0" \ - "/sys/class/gpio/export\0 177\0" \ - "/sys/class/gpio/gpio177/direction\0out\0" \ - "\0\0"; - diff --git a/books/pru-cookbook/02start/code/hello2.pru2_0.c b/books/pru-cookbook/02start/code/hello2.pru2_0.c deleted file mode 100644 index 564e1bc9..00000000 --- a/books/pru-cookbook/02start/code/hello2.pru2_0.c +++ /dev/null @@ -1,63 +0,0 @@ -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" - -volatile register unsigned int __R30; -volatile register unsigned int __R31; - -void main(void) { - int i; - - // uint32_t *gpio1 = (uint32_t *)GPIO1; - // uint32_t *gpio2 = (uint32_t *)GPIO2; - uint32_t *gpio3 = (uint32_t *)GPIO3; - // uint32_t *gpio4 = (uint32_t *)GPIO4; - uint32_t *gpio5 = (uint32_t *)GPIO5; - uint32_t *gpio6 = (uint32_t *)GPIO6; - // uint32_t *gpio7 = (uint32_t *)GPIO7; - uint32_t *gpio8 = (uint32_t *)GPIO8; - - // Select which pins to toggle. These are all on pru1_1 - uint32_t gpio = P9_16 | P8_15 | P8_16 | P8_26; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - for(i=0; i<100; i++) { - gpio5[GPIO_SETDATAOUT] = USR1; // Turn the USR1 LED on - gpio3[GPIO_CLEARDATAOUT] = USR2; - gpio8[GPIO_SETDATAOUT] = P8_17; - gpio6[GPIO_SETDATAOUT] = P9_25; - - __R30 |= gpio; // Set the GPIO pin to 1 - - __delay_cycles(500000000/5); // Wait 1/2 second - - gpio5[GPIO_CLEARDATAOUT] = USR1; - gpio3[GPIO_SETDATAOUT] = USR2; - gpio8[GPIO_CLEARDATAOUT] = P8_17; - gpio6[GPIO_CLEARDATAOUT] = P9_25; - - __R30 &= ~gpio; // Clear the GPIO pin - - __delay_cycles(500000000/5); - - if((__R31&P8_19) == P8_19) { - gpio3[GPIO_CLEARDATAOUT] = USR3; // Turn on LED - } else - gpio3[GPIO_SETDATAOUT] = USR3; // Turn off LED - } - __halt(); -} - -// Turns off triggers -#pragma DATA_SECTION(init_pins, ".init_pins") -#pragma RETAIN(init_pins) -const char init_pins[] = - "/sys/class/leds/beaglebone:green:usr1/trigger\0none\0" \ - "/sys/class/leds/beaglebone:green:usr2/trigger\0none\0" \ - "/sys/class/gpio/export\0 177\0" \ - "/sys/class/gpio/gpio177/direction\0out\0" \ - "\0\0"; - diff --git a/books/pru-cookbook/02start/code/hello2.pru2_1.c b/books/pru-cookbook/02start/code/hello2.pru2_1.c deleted file mode 100644 index 564e1bc9..00000000 --- a/books/pru-cookbook/02start/code/hello2.pru2_1.c +++ /dev/null @@ -1,63 +0,0 @@ -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" - -volatile register unsigned int __R30; -volatile register unsigned int __R31; - -void main(void) { - int i; - - // uint32_t *gpio1 = (uint32_t *)GPIO1; - // uint32_t *gpio2 = (uint32_t *)GPIO2; - uint32_t *gpio3 = (uint32_t *)GPIO3; - // uint32_t *gpio4 = (uint32_t *)GPIO4; - uint32_t *gpio5 = (uint32_t *)GPIO5; - uint32_t *gpio6 = (uint32_t *)GPIO6; - // uint32_t *gpio7 = (uint32_t *)GPIO7; - uint32_t *gpio8 = (uint32_t *)GPIO8; - - // Select which pins to toggle. These are all on pru1_1 - uint32_t gpio = P9_16 | P8_15 | P8_16 | P8_26; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - for(i=0; i<100; i++) { - gpio5[GPIO_SETDATAOUT] = USR1; // Turn the USR1 LED on - gpio3[GPIO_CLEARDATAOUT] = USR2; - gpio8[GPIO_SETDATAOUT] = P8_17; - gpio6[GPIO_SETDATAOUT] = P9_25; - - __R30 |= gpio; // Set the GPIO pin to 1 - - __delay_cycles(500000000/5); // Wait 1/2 second - - gpio5[GPIO_CLEARDATAOUT] = USR1; - gpio3[GPIO_SETDATAOUT] = USR2; - gpio8[GPIO_CLEARDATAOUT] = P8_17; - gpio6[GPIO_CLEARDATAOUT] = P9_25; - - __R30 &= ~gpio; // Clear the GPIO pin - - __delay_cycles(500000000/5); - - if((__R31&P8_19) == P8_19) { - gpio3[GPIO_CLEARDATAOUT] = USR3; // Turn on LED - } else - gpio3[GPIO_SETDATAOUT] = USR3; // Turn off LED - } - __halt(); -} - -// Turns off triggers -#pragma DATA_SECTION(init_pins, ".init_pins") -#pragma RETAIN(init_pins) -const char init_pins[] = - "/sys/class/leds/beaglebone:green:usr1/trigger\0none\0" \ - "/sys/class/leds/beaglebone:green:usr2/trigger\0none\0" \ - "/sys/class/gpio/export\0 177\0" \ - "/sys/class/gpio/gpio177/direction\0out\0" \ - "\0\0"; - diff --git a/books/pru-cookbook/02start/code/setup.sh b/books/pru-cookbook/02start/code/setup.sh deleted file mode 100755 index eaf9943a..00000000 --- a/books/pru-cookbook/02start/code/setup.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -export TARGET=hello.pru0 - -echo TARGET=$TARGET diff --git a/books/pru-cookbook/02start/code/setup2.sh b/books/pru-cookbook/02start/code/setup2.sh deleted file mode 100755 index 76dd6713..00000000 --- a/books/pru-cookbook/02start/code/setup2.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -export TARGET=hello2.pru1 - -echo TARGET=$TARGET diff --git a/books/pru-cookbook/02start/start.rst b/books/pru-cookbook/02start/start.rst index e7a40243..3889fa93 100644 --- a/books/pru-cookbook/02start/start.rst +++ b/books/pru-cookbook/02start/start.rst @@ -9,8 +9,9 @@ latest software image on your beagle, how to run the Cloud9 IDE and how to blink an LED. If you already have your Beagle and know your way around it, you can find the -code (and the whole book) on the PRU Cookbook github site: -https://github.com/MarkAYoder/PRUCookbook. +code at https://git.beagleboard.org/beagleboard/pru-cookbook-code and book +contents at https://git.beagleboard.org/docs/docs.beagleboard.io under the +books/pru-cookbook directory. Selecting a Beagle ******************** @@ -256,12 +257,12 @@ as shown in :ref:`start_c9_show_home`. If you want to edit files beyond your home directory you can link to the root file system by: -.. code-block:: bash +.. code-block:: shell-session - bone$ *cd* - bone$ *ln -s / root* - bone$ *cd root* - bone$ *ls* + bone$ cd + bone$ ln -s / root + bone$ cd root + bone$ ls bbb-uEnv.txt boot etc ID.txt lost+found mnt opt root sbin sys usr bin dev home lib media nfs-uEnv.txt proc run srv tmp var @@ -278,29 +279,29 @@ You are ready to start playing with the examples and need to find the code. Solution --------- -You can find the code (and the whole book) on the PRU Cookbook github site: -<https://github.com/MarkAYoder/PRUCookbook/tree/master/docs>. Just clone -it on your Beagle and then look in the *docs* directory. +You can find the code on the PRU Cookbook Code project on git.beagleboard.org: +https://git.beagleboard.org/beagleboard/pru-cookbook-code. Just clone +it on your Beagle. -.. code-block::bash - - bone$ *git clone https://github.com/MarkAYoder/PRUCookbook.git* - bone$ *cd PRUCookbook/docs/* - bone$ *ls -F* - 01case/ 05blocks/ book.adoc copyright.adoc index.html projects.adoc - 02start/ 06io/ book.html hack.sh* Makefile projects.html - 03details/ 07more/ book.pdf header.adoc notes.adoc style.adoc - 04debug/ 08ai/ common/ index.adoc notes.html style.html +.. code-block:: shell-session + bone$ git clone https://git.beagleboard.org/beagleboard/pru-cookbook-code + bone$ cd pru-cookbook-code + bone$ ls -F + 01case/ 03details/ 05blocks/ 07more/ README.md + 02start/ 04details/ 06io/ 08ai/ Each chapter has its own directory and within that directory is a **code** directory that has all of the code. -.. code-block::bash +.. code-block:: shell-session - bone$ *cd 02start/code/* - bone$ *ls* + bone$ cd 02start/ + bone$ ls hello.pru0.c hello.pru1_1.c Makefile setup.sh + ai.notes hello2.pru1_1.c hello2.pru2_1.c Makefile + hello2.pru0.c hello2.pru1.c hello.pru0.c setup2.sh* + hello2.pru1_0.c hello2.pru2_0.c hello.pru1_1.c setup.sh* Go and explore. @@ -322,19 +323,19 @@ is some code that blinks the ``USR3`` LED ten times using the PRU. .. _start_hello: -.. literalinclude:: code/hello.pru0.c +.. literalinclude:: ../code/02start/hello.pru0.c :caption: hello.pru0.c :linenos: -:download:`hello.pru0.c <code/hello.pru0.c>` +:download:`hello.pru0.c <../code/02start/hello.pru0.c>` Later chapters will go into details of how this code works, but if you want to run it right now do the following. -.. code-block:: bash +.. code-block:: shell-session - bone$ *git clone https://github.com/MarkAYoder/PRUCookbook.git* - bone$ *cd PRUCookbook/docs/02start/code* + bone$ git clone https://git.beagleboard.org/beagleboard/pru-cookbook-code + bone$ cd pru-cookbook-code/02start .. tip:: @@ -347,9 +348,9 @@ to run it right now do the following. Running Code on the Black or Pocket ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. code-block:: bash +.. code-block:: shell-session - bone$ *make TARGET=hello.pru0* + bone$ make TARGET=hello.pru0 /var/lib/cloud9/common/Makefile:28: MODEL=TI_AM335x_BeagleBone_Black,TARGET=hello.pru0,COMMON=/var/lib/cloud9/common /var/lib/cloud9/common/Makefile:147: GEN_DIR=/tmp/cloud9-examples,CHIP=am335x,PROC=pru,PRUN=0,PRU_DIR=/sys/class/remoteproc/remoteproc1,EXE=.out - Stopping PRU 0 @@ -366,9 +367,9 @@ Running Code on the Black or Pocket Running Code on the AI ~~~~~~~~~~~~~~~~~~~~~~~ -.. code-block:: bash +.. code-block:: shell-session - bone$ *make TARGET=hello.pru1_1* + bone$ make TARGET=hello.pru1_1 /var/lib/cloud9/common/Makefile:28: MODEL=BeagleBoard.org_BeagleBone_AI,TARGET=hello.pru1_1 - Stopping PRU 1_1 CC hello.pru1_1.c diff --git a/books/pru-cookbook/03details/code/Makefile b/books/pru-cookbook/03details/code/Makefile deleted file mode 100644 index a7557fda..00000000 --- a/books/pru-cookbook/03details/code/Makefile +++ /dev/null @@ -1 +0,0 @@ -include /var/lib/cloud9/common/Makefile diff --git a/books/pru-cookbook/03details/code/am335x_pru.cmd b/books/pru-cookbook/03details/code/am335x_pru.cmd deleted file mode 100644 index 67005475..00000000 --- a/books/pru-cookbook/03details/code/am335x_pru.cmd +++ /dev/null @@ -1,87 +0,0 @@ -/****************************************************************************/ -/* AM335x_PRU.cmd */ -/* Copyright (c) 2015 Texas Instruments Incorporated */ -/* */ -/* Description: This file is a linker command file that can be used for */ -/* linking PRU programs built with the C compiler and */ -/* the resulting .out file on an AM335x device. */ -/****************************************************************************/ - --cr /* Link using C conventions */ - -/* Specify the System Memory Map */ -MEMORY -{ - PAGE 0: - PRU_IMEM : org = 0x00000000 len = 0x00002000 /* 8kB PRU0 Instruction RAM */ - - PAGE 1: - - /* RAM */ - - PRU_DMEM_0_1 : org = 0x00000000 len = 0x00002000 CREGISTER=24 /* 8kB PRU Data RAM 0_1 */ - PRU_DMEM_1_0 : org = 0x00002000 len = 0x00002000 CREGISTER=25 /* 8kB PRU Data RAM 1_0 */ - - PAGE 2: - PRU_SHAREDMEM : org = 0x00010000 len = 0x00003000 CREGISTER=28 /* 12kB Shared RAM */ - - DDR : org = 0x80000000 len = 0x00000100 CREGISTER=31 - L3OCMC : org = 0x40000000 len = 0x00010000 CREGISTER=30 - - - /* Peripherals */ - - PRU_CFG : org = 0x00026000 len = 0x00000044 CREGISTER=4 - PRU_ECAP : org = 0x00030000 len = 0x00000060 CREGISTER=3 - PRU_IEP : org = 0x0002E000 len = 0x0000031C CREGISTER=26 - PRU_INTC : org = 0x00020000 len = 0x00001504 CREGISTER=0 - PRU_UART : org = 0x00028000 len = 0x00000038 CREGISTER=7 - - DCAN0 : org = 0x481CC000 len = 0x000001E8 CREGISTER=14 - DCAN1 : org = 0x481D0000 len = 0x000001E8 CREGISTER=15 - DMTIMER2 : org = 0x48040000 len = 0x0000005C CREGISTER=1 - PWMSS0 : org = 0x48300000 len = 0x000002C4 CREGISTER=18 - PWMSS1 : org = 0x48302000 len = 0x000002C4 CREGISTER=19 - PWMSS2 : org = 0x48304000 len = 0x000002C4 CREGISTER=20 - GEMAC : org = 0x4A100000 len = 0x0000128C CREGISTER=9 - I2C1 : org = 0x4802A000 len = 0x000000D8 CREGISTER=2 - I2C2 : org = 0x4819C000 len = 0x000000D8 CREGISTER=17 - MBX0 : org = 0x480C8000 len = 0x00000140 CREGISTER=22 - MCASP0_DMA : org = 0x46000000 len = 0x00000100 CREGISTER=8 - MCSPI0 : org = 0x48030000 len = 0x000001A4 CREGISTER=6 - MCSPI1 : org = 0x481A0000 len = 0x000001A4 CREGISTER=16 - MMCHS0 : org = 0x48060000 len = 0x00000300 CREGISTER=5 - SPINLOCK : org = 0x480CA000 len = 0x00000880 CREGISTER=23 - TPCC : org = 0x49000000 len = 0x00001098 CREGISTER=29 - UART1 : org = 0x48022000 len = 0x00000088 CREGISTER=11 - UART2 : org = 0x48024000 len = 0x00000088 CREGISTER=12 - - RSVD10 : org = 0x48318000 len = 0x00000100 CREGISTER=10 - RSVD13 : org = 0x48310000 len = 0x00000100 CREGISTER=13 - RSVD21 : org = 0x00032400 len = 0x00000100 CREGISTER=21 - RSVD27 : org = 0x00032000 len = 0x00000100 CREGISTER=27 - -} - -/* Specify the sections allocation into memory */ -SECTIONS { - /* Forces _c_int00 to the start of PRU IRAM. Not necessary when loading - an ELF file, but useful when loading a binary */ - .text:_c_int00* > 0x0, PAGE 0 - - .text > PRU_IMEM, PAGE 0 - .stack > PRU_DMEM_0_1, PAGE 1 - .bss > PRU_DMEM_0_1, PAGE 1 - .cio > PRU_DMEM_0_1, PAGE 1 - .data > PRU_DMEM_0_1, PAGE 1 - .switch > PRU_DMEM_0_1, PAGE 1 - .sysmem > PRU_DMEM_0_1, PAGE 1 - .cinit > PRU_DMEM_0_1, PAGE 1 - .rodata > PRU_DMEM_0_1, PAGE 1 - .rofardata > PRU_DMEM_0_1, PAGE 1 - .farbss > PRU_DMEM_0_1, PAGE 1 - .fardata > PRU_DMEM_0_1, PAGE 1 - - .resource_table > PRU_DMEM_0_1, PAGE 1 - .init_pins > PRU_DMEM_0_1, PAGE 1 -} \ No newline at end of file diff --git a/books/pru-cookbook/03details/code/encoder_setup.sh b/books/pru-cookbook/03details/code/encoder_setup.sh deleted file mode 100755 index ffc4ad68..00000000 --- a/books/pru-cookbook/03details/code/encoder_setup.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash -# Configure the pins based on which Beagle is running -machine=$(awk '{print $NF}' /proc/device-tree/model) -echo -n $machine - -# Configure eQEP pins -if [ $machine = "Black" ]; then - echo " Found" - pins="P9_92 P9_27 P8_35 P8_33 P8_12 P8_11 P8_41 P8_42" -elif [ $machine = "Blue" ]; then - echo " Found" - pins="" -elif [ $machine = "PocketBeagle" ]; then - echo " Found" - pins="P1_31 P2_34 P2_10 P2_24 P2_33" -else - echo " Not Found" - pins="" -fi - -for pin in $pins -do - echo $pin - config-pin $pin qep - config-pin -q $pin -done - -########################################## -# Configure PRU pins -if [ $machine = "Black" ]; then - echo " Found" - pins="P8_16 P8_15" -elif [ $machine = "Blue" ]; then - echo " Found" - pins="" -elif [ $machine = "PocketBeagle" ]; then - echo " Found" - pins="P2_09 P2_18" -else - echo " Not Found" - pins="" -fi - -for pin in $pins -do - echo $pin - config-pin $pin pruin - config-pin -q $pin -done diff --git a/books/pru-cookbook/03details/code/gpio_setup.sh b/books/pru-cookbook/03details/code/gpio_setup.sh deleted file mode 100755 index e676ed7a..00000000 --- a/books/pru-cookbook/03details/code/gpio_setup.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -export TARGET=gpio.pru0 -echo TARGET=$TARGET - -# Configure the PRU pins based on which Beagle is running -machine=$(awk '{print $NF}' /proc/device-tree/model) -echo -n $machine -if [ $machine = "Black" ]; then - echo " Found" - pins="P9_11" -elif [ $machine = "Blue" ]; then - echo " Found" - pins="" -elif [ $machine = "PocketBeagle" ]; then - echo " Found" - pins="P2_05" -else - echo " Not Found" - pins="" -fi - -for pin in $pins -do - echo $pin - config-pin $pin gpio - config-pin -q $pin -done diff --git a/books/pru-cookbook/03details/code/servos_setup.sh b/books/pru-cookbook/03details/code/servos_setup.sh deleted file mode 100755 index 330e8f34..00000000 --- a/books/pru-cookbook/03details/code/servos_setup.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -# Configure the PRU pins based on which Beagle is running -machine=$(awk '{print $NF}' /proc/device-tree/model) -echo -n $machine -if [ $machine = "Black" ]; then - echo " Found" - pins="P8_27 P8_28 P8_29 P8_30 P8_39 P8_40 P8_41 P8_42" -elif [ $machine = "Blue" ]; then - echo " Found" - pins="" -elif [ $machine = "PocketBeagle" ]; then - echo " Found" - pins="P2_35 P1_35 P1_02 P1_04" -else - echo " Not Found" - pins="" -fi - -for pin in $pins -do - echo $pin - config-pin $pin pruout - config-pin -q $pin -done \ No newline at end of file diff --git a/books/pru-cookbook/03details/details.rst b/books/pru-cookbook/03details/details.rst index 8052ff00..6dd6cddd 100644 --- a/books/pru-cookbook/03details/details.rst +++ b/books/pru-cookbook/03details/details.rst @@ -32,15 +32,15 @@ Solution It's all on a GitHub repository. -.. code-block:: bash +.. code-block:: shell-session - bone$ git clone https://github.com/MarkAYoder/PRUCookbook.git + bone$ git clone https://git.beagleboard.org/beagleboard/pru-cookbook-code +.. note:: + #TODO#: The version of code used needs to be noted in the documentation. .. note:: - #TODO#: There needs to be a code-only repo that is validated against the documentation - code to be identical for specific version. The version needs to be noted in the - documentation. + #TODO#: Why is this documented in multiple places? .. _compiling_with_clpru_and_lnkpru: @@ -58,7 +58,7 @@ Solution The PRU compiler and linker are already installed on many images. They are called ``clpru`` and ``lnkpru``. Do the following to see if ``clpru`` is installed. -.. code-block:: bash +.. code-block:: shell-session bone$ which clpru /usr/bin/clpru @@ -69,7 +69,7 @@ They are called ``clpru`` and ``lnkpru``. Do the following to see if ``clpru`` https://elinux.org/Beagleboard:BeagleBoneBlack_Debian#TI_PRU_Code_Generation_Tools to install it. -.. code-block:: bash +.. code-block:: shell-session bone$ sudo apt update bone$ sudo apt install ti-pru-cgt-installer @@ -85,7 +85,7 @@ In fact there are PRU versions of many of the standard code generation tools. code tools ~~~~~~~~~~~ -.. code-block:: bash +.. code-block:: shell-session bone$ ls /usr/bin/*pru /usr/bin/abspru /usr/bin/clistpru /usr/bin/hexpru /usr/bin/ofdpru @@ -109,13 +109,13 @@ Solution Edit ``/boot/uEnv.txt`` and enble pru_rproc by doing the following. -.. code-block:: bash +.. code-block:: shell-session - bone$ *sudo vi /boot/uEnv.txt* + bone$ sudo vi /boot/uEnv.txt Around line 40 you will see: -.. code-block:: bash +.. code-block:: shell-session ###pru_rproc (4.19.x-ti kernel) uboot_overlay_pru=AM335X-PRU-RPROC-4-19-TI-00A0.dtbo @@ -123,7 +123,7 @@ Around line 40 you will see: Uncomment the ``uboot_overlay`` line as shown and then reboot. ``/dev/remoteproc`` should now be there. -.. code-block:: bash +.. code-block:: shell-session bone$ sudo reboot bone$ ls -ls /dev/remoteproc/ @@ -144,15 +144,15 @@ Solution Change to the directory of the code you want to run. -.. code-block:: bash +.. code-block:: shell-session - bone$ cd PRUCookbook/docs/06io/code + bone$ cd pru-cookbook-code/06io bone$ ls gpio.pru0.c Makefile setup.sh Source the setup file. -.. code-block:: bash +.. code-block:: shell-session bone$ source setup.sh TARGET=gpio.pru0 @@ -163,7 +163,7 @@ Source the setup file. Now you are ready to compile and run. This is automated for you in the Makefile -.. code-block:: bash +.. code-block:: shell-session bone$ make /var/lib/cloud9/common/Makefile:28: MODEL=TI_AM335x_BeagleBone_Black,TARGET=gpio.pru0,COMMON=/var/lib/cloud9/common @@ -197,7 +197,7 @@ The file extension ``.pru0`` specifies the number of the PRU you are using You can override the ``TARGET`` on the command line. -.. code-block:: bash +.. code-block:: shell-session bone$ cp gpio.pru0.c gpio.pru1.c bone$ export TARGET=gpio.pru1 @@ -206,7 +206,7 @@ Notice the ``TARGET`` doesn't have the ``.c`` on the end. You can also specify them when running ``make``. -.. code-block:: bash +.. code-block:: shell-session bone$ cp gpio.pru0.c gpio.pru1.c bone$ make TARGET=gpio.pru1 @@ -215,11 +215,11 @@ The setup file also contains instructions to figure out which Beagle you are run and then configure the pins accordingly. -.. literalinclude:: code/gpio_setup.sh +.. literalinclude:: ../code/06io/gpio_setup.sh :caption: gpio_setup.sh :linenos: -:download:`gpio_setup.sh <code/gpio_setup.sh>` +:download:`gpio_setup.sh <../code/06io/gpio_setup.sh>` .. table:: @@ -257,7 +257,7 @@ Solution It's easy, if you already have ``TARGET`` set up: -.. code-block:: bash +.. code-block:: shell-session bone$ make stop - Stopping PRU 0 @@ -272,7 +272,7 @@ is stopped. This assumes ``TARGET`` is set to the PRU you are using. If you want to control the other PRU use: -.. code-block:: bash +.. code-block:: shell-session bone$ cp gpio.pru0.c gpio.pru1.c bone$ make TARGET=gpio.pru1 @@ -304,11 +304,11 @@ It's assumed you already know how Makefiles work. If not, there are many resources online that can bring you up to speed. Here is the local ``Makefile`` used throughout this book. -.. literalinclude:: code/Makefile +.. literalinclude:: ../code/06io/Makefile :caption: Local Makefile :linenos: -:download:`Makefile <code/Makefile>` +:download:`Makefile <../code/06io/Makefile>` Each of the local Makefiles refer to the same standard Makefile. The details of how the Makefile works is beyond the scope of this cookbook. @@ -335,11 +335,11 @@ The ``am57xx_pru.cmd`` does the same for the AI. Both files can be found in ``/var/lib/cloud9/common``. -.. literalinclude:: code/am335x_pru.cmd +.. literalinclude:: ../code/06io/am335x_pru.cmd :caption: am335x_pru.cmd :linenos: -:download:`am335x_pru.cmd <code/am335x_pru.cmd>` +:download:`am335x_pru.cmd <../code/06io/am335x_pru.cmd>` .. TODO does this need updating? @@ -412,7 +412,7 @@ The PRUs appear in the Linux file space at ``/dev/remoteproc/``. Finding the PRUs ~~~~~~~~~~~~~~~~~~~ -.. code-block:: bash +.. code-block:: shell-session bone$ cd /dev/remoteproc/ bone$ ls @@ -420,7 +420,7 @@ Finding the PRUs Or if you are on the AI: -.. code-block:: bash +.. code-block:: shell-session bone$ cd /dev/remoteproc/ bone$ ls @@ -430,7 +430,7 @@ You see there that the AI has two pairs of PRUs, plus a couple of DSPs and other Here we see PRU 0 and PRU 1 in the path. Let's follow PRU 0. -.. code-block:: bash +.. code-block:: shell-session bone$ cd pruss-core0 bone$ ls @@ -439,7 +439,7 @@ Here we see PRU 0 and PRU 1 in the path. Let's follow PRU 0. Here we see the files that control PRU 0. ``firmware`` tells where in ``/lib/firmware`` to look for the code to run on the PRU. -.. code-block:: bash +.. code-block:: shell-session bone$ cat firmware am335x-pru0-fw @@ -464,11 +464,11 @@ everything is already configured for you. If you are on the Black or Pocket you'll need to run the following script. -.. literalinclude:: code/servos_setup.sh +.. literalinclude:: ../code/06io/servos_setup.sh :caption: servos_setup.sh :linenos: -:download:`servos_setup.sh <code/servos_setup.sh>` +:download:`servos_setup.sh <../code/06io/servos_setup.sh>` Discussion ----------- @@ -494,11 +494,11 @@ It depends on which Beagle you are running on. If you are on the AI or Blue, everything is already configured for you. If you are on the Black or Pocket you'll need to run the following script. -.. literalinclude:: code/encoder_setup.sh +.. literalinclude:: ../code/06io/encoder_setup.sh :caption: encoder_setup.sh :linenos: -:download:`encoder_setup.sh <code/encoder_setup.sh>` +:download:`encoder_setup.sh <../code/06io/encoder_setup.sh>` Discussion ----------- diff --git a/books/pru-cookbook/04debug/code/AM335x_PRU.cmd b/books/pru-cookbook/04debug/code/AM335x_PRU.cmd deleted file mode 100644 index b62f0440..00000000 --- a/books/pru-cookbook/04debug/code/AM335x_PRU.cmd +++ /dev/null @@ -1,86 +0,0 @@ -/****************************************************************************/ -/* AM335x_PRU.cmd */ -/* Copyright (c) 2015 Texas Instruments Incorporated */ -/* */ -/* Description: This file is a linker command file that can be used for */ -/* linking PRU programs built with the C compiler and */ -/* the resulting .out file on an AM335x device. */ -/****************************************************************************/ - --cr /* Link using C conventions */ - -/* Specify the System Memory Map */ -MEMORY -{ - PAGE 0: - PRU_IMEM : org = 0x00000000 len = 0x00002000 /* 8kB PRU0 Instruction RAM */ - - PAGE 1: - - /* RAM */ - - PRU_DMEM_0_1 : org = 0x00000000 len = 0x00002000 CREGISTER=24 /* 8kB PRU Data RAM 0_1 */ - PRU_DMEM_1_0 : org = 0x00002000 len = 0x00002000 CREGISTER=25 /* 8kB PRU Data RAM 1_0 */ - - PAGE 2: - PRU_SHAREDMEM : org = 0x00010000 len = 0x00003000 CREGISTER=28 /* 12kB Shared RAM */ - - DDR : org = 0x80000000 len = 0x00000100 CREGISTER=31 - L3OCMC : org = 0x40000000 len = 0x00010000 CREGISTER=30 - - - /* Peripherals */ - - PRU_CFG : org = 0x00026000 len = 0x00000044 CREGISTER=4 - PRU_ECAP : org = 0x00030000 len = 0x00000060 CREGISTER=3 - PRU_IEP : org = 0x0002E000 len = 0x0000031C CREGISTER=26 - PRU_INTC : org = 0x00020000 len = 0x00001504 CREGISTER=0 - PRU_UART : org = 0x00028000 len = 0x00000038 CREGISTER=7 - - DCAN0 : org = 0x481CC000 len = 0x000001E8 CREGISTER=14 - DCAN1 : org = 0x481D0000 len = 0x000001E8 CREGISTER=15 - DMTIMER2 : org = 0x48040000 len = 0x0000005C CREGISTER=1 - PWMSS0 : org = 0x48300000 len = 0x000002C4 CREGISTER=18 - PWMSS1 : org = 0x48302000 len = 0x000002C4 CREGISTER=19 - PWMSS2 : org = 0x48304000 len = 0x000002C4 CREGISTER=20 - GEMAC : org = 0x4A100000 len = 0x0000128C CREGISTER=9 - I2C1 : org = 0x4802A000 len = 0x000000D8 CREGISTER=2 - I2C2 : org = 0x4819C000 len = 0x000000D8 CREGISTER=17 - MBX0 : org = 0x480C8000 len = 0x00000140 CREGISTER=22 - MCASP0_DMA : org = 0x46000000 len = 0x00000100 CREGISTER=8 - MCSPI0 : org = 0x48030000 len = 0x000001A4 CREGISTER=6 - MCSPI1 : org = 0x481A0000 len = 0x000001A4 CREGISTER=16 - MMCHS0 : org = 0x48060000 len = 0x00000300 CREGISTER=5 - SPINLOCK : org = 0x480CA000 len = 0x00000880 CREGISTER=23 - TPCC : org = 0x49000000 len = 0x00001098 CREGISTER=29 - UART1 : org = 0x48022000 len = 0x00000088 CREGISTER=11 - UART2 : org = 0x48024000 len = 0x00000088 CREGISTER=12 - - RSVD10 : org = 0x48318000 len = 0x00000100 CREGISTER=10 - RSVD13 : org = 0x48310000 len = 0x00000100 CREGISTER=13 - RSVD21 : org = 0x00032400 len = 0x00000100 CREGISTER=21 - RSVD27 : org = 0x00032000 len = 0x00000100 CREGISTER=27 - -} - -/* Specify the sections allocation into memory */ -SECTIONS { - /* Forces _c_int00 to the start of PRU IRAM. Not necessary when loading - an ELF file, but useful when loading a binary */ - .text:_c_int00* > 0x0, PAGE 0 - - .text > PRU_IMEM, PAGE 0 - .stack > PRU_DMEM_0_1, PAGE 1 - .bss > PRU_DMEM_0_1, PAGE 1 - .cio > PRU_DMEM_0_1, PAGE 1 - .data > PRU_DMEM_0_1, PAGE 1 - .switch > PRU_DMEM_0_1, PAGE 1 - .sysmem > PRU_DMEM_0_1, PAGE 1 - .cinit > PRU_DMEM_0_1, PAGE 1 - .rodata > PRU_DMEM_0_1, PAGE 1 - .rofardata > PRU_DMEM_0_1, PAGE 1 - .farbss > PRU_DMEM_0_1, PAGE 1 - .fardata > PRU_DMEM_0_1, PAGE 1 - - .resource_table > PRU_DMEM_0_1, PAGE 1 -} diff --git a/books/pru-cookbook/04debug/code/Makefile b/books/pru-cookbook/04debug/code/Makefile deleted file mode 100644 index a7557fda..00000000 --- a/books/pru-cookbook/04debug/code/Makefile +++ /dev/null @@ -1 +0,0 @@ -include /var/lib/cloud9/common/Makefile diff --git a/books/pru-cookbook/04debug/code/copyright.c b/books/pru-cookbook/04debug/code/copyright.c deleted file mode 100644 index a34918fa..00000000 --- a/books/pru-cookbook/04debug/code/copyright.c +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ - * - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Texas Instruments Incorporated nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ diff --git a/books/pru-cookbook/04debug/code/resource_table_empty.h b/books/pru-cookbook/04debug/code/resource_table_empty.h deleted file mode 100644 index c14bd2b2..00000000 --- a/books/pru-cookbook/04debug/code/resource_table_empty.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ - * - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Texas Instruments Incorporated nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * ======== resource_table_empty.h ======== - * - * Define the resource table entries for all PRU cores. This will be - * incorporated into corresponding base images, and used by the remoteproc - * on the host-side to allocated/reserve resources. Note the remoteproc - * driver requires that all PRU firmware be built with a resource table. - * - * This file contains an empty resource table. It can be used either as: - * - * 1) A template, or - * 2) As-is if a PRU application does not need to configure PRU_INTC - * or interact with the rpmsg driver - * - */ - -#ifndef _RSC_TABLE_PRU_H_ -#define _RSC_TABLE_PRU_H_ - -#include <stddef.h> -#include <rsc_types.h> - -struct my_resource_table { - struct resource_table base; - - uint32_t offset[1]; /* Should match 'num' in actual definition */ -}; - -#pragma DATA_SECTION(pru_remoteproc_ResourceTable, ".resource_table") -#pragma RETAIN(pru_remoteproc_ResourceTable) -struct my_resource_table pru_remoteproc_ResourceTable = { - 1, /* we're the first version that implements this */ - 0, /* number of entries in the table */ - 0, 0, /* reserved, must be zero */ - 0, /* offset[0] */ -}; - -#endif /* _RSC_TABLE_PRU_H_ */ - diff --git a/books/pru-cookbook/04debug/code/uart1.pru0.c b/books/pru-cookbook/04debug/code/uart1.pru0.c deleted file mode 100644 index e9b40d5c..00000000 --- a/books/pru-cookbook/04debug/code/uart1.pru0.c +++ /dev/null @@ -1,88 +0,0 @@ -// From: http://git.ti.com/pru-software-support-package/pru-software-support-package/trees/master/examples/am335x/PRU_Hardware_UART - -#include <stdint.h> -#include <pru_uart.h> -#include "resource_table_empty.h" - -/* The FIFO size on the PRU UART is 16 bytes; however, we are (arbitrarily) - * only going to send 8 at a time */ -#define FIFO_SIZE 16 -#define MAX_CHARS 8 - -void main(void) -{ - uint8_t tx; - uint8_t rx; - uint8_t cnt; - - /* hostBuffer points to the string to be printed */ - char* hostBuffer; - - /*** INITIALIZATION ***/ - - /* Set up UART to function at 115200 baud - DLL divisor is 104 at 16x oversample - * 192MHz / 104 / 16 = ~115200 */ - CT_UART.DLL = 104; - CT_UART.DLH = 0; - CT_UART.MDR = 0x0; - - /* Enable Interrupts in UART module. This allows the main thread to poll for - * Receive Data Available and Transmit Holding Register Empty */ - CT_UART.IER = 0x7; - - /* If FIFOs are to be used, select desired trigger level and enable - * FIFOs by writing to FCR. FIFOEN bit in FCR must be set first before - * other bits are configured */ - /* Enable FIFOs for now at 1-byte, and flush them */ - CT_UART.FCR = (0x8) | (0x4) | (0x2) | (0x1); - //CT_UART.FCR = (0x80) | (0x4) | (0x2) | (0x01); // 8-byte RX FIFO trigger - - /* Choose desired protocol settings by writing to LCR */ - /* 8-bit word, 1 stop bit, no parity, no break control and no divisor latch */ - CT_UART.LCR = 3; - - /* Enable loopback for test */ - CT_UART.MCR = 0x00; - - /* Choose desired response to emulation suspend events by configuring - * FREE bit and enable UART by setting UTRST and URRST in PWREMU_MGMT */ - /* Allow UART to run free, enable UART TX/RX */ - CT_UART.PWREMU_MGMT = 0x6001; - - /*** END INITIALIZATION ***/ - - /* Priming the 'hostbuffer' with a message */ - hostBuffer = "Hello! This is a long string\r\n"; - - /*** SEND SOME DATA ***/ - - /* Let's send/receive some dummy data */ - while(1) { - cnt = 0; - while(1) { - /* Load character, ensure it is not string termination */ - if ((tx = hostBuffer[cnt]) == '\0') - break; - cnt++; - CT_UART.THR = tx; - - /* Because we are doing loopback, wait until LSR.DR == 1 - * indicating there is data in the RX FIFO */ - while ((CT_UART.LSR & 0x1) == 0x0); - - /* Read the value from RBR */ - rx = CT_UART.RBR; - - /* Wait for TX FIFO to be empty */ - while (!((CT_UART.FCR & 0x2) == 0x2)); - } - } - - /*** DONE SENDING DATA ***/ - - /* Disable UART before halting */ - CT_UART.PWREMU_MGMT = 0x0; - - /* Halt PRU core */ - __halt(); -} diff --git a/books/pru-cookbook/04debug/code/uart1.pru1_0.c b/books/pru-cookbook/04debug/code/uart1.pru1_0.c deleted file mode 100644 index 4c558bb9..00000000 --- a/books/pru-cookbook/04debug/code/uart1.pru1_0.c +++ /dev/null @@ -1,90 +0,0 @@ -// From: http://git.ti.com/pru-software-support-package/pru-software-support-package/trees/master/examples/am335x/PRU_Hardware_UART -// This example was converted to the am5729 by changing the names in pru_uart.h -// for the am335x to the more descriptive names for the am5729. -// For example DLL convertes to DIVISOR_REGISTER_LSB_ -#include <stdint.h> -#include <pru_uart.h> -#include "resource_table_empty.h" - -/* The FIFO size on the PRU UART is 16 bytes; however, we are (arbitrarily) - * only going to send 8 at a time */ -#define FIFO_SIZE 16 -#define MAX_CHARS 8 - -void main(void) -{ - uint8_t tx; - uint8_t rx; - uint8_t cnt; - - /* hostBuffer points to the string to be printed */ - char* hostBuffer; - - /*** INITIALIZATION ***/ - - /* Set up UART to function at 115200 baud - DLL divisor is 104 at 16x oversample - * 192MHz / 104 / 16 = ~115200 */ - CT_UART.DIVISOR_REGISTER_LSB_ = 104; - CT_UART.DIVISOR_REGISTER_MSB_ = 0; - CT_UART.MODE_DEFINITION_REGISTER = 0x0; - - /* Enable Interrupts in UART module. This allows the main thread to poll for - * Receive Data Available and Transmit Holding Register Empty */ - CT_UART.INTERRUPT_ENABLE_REGISTER = 0x7; - - /* If FIFOs are to be used, select desired trigger level and enable - * FIFOs by writing to FCR. FIFOEN bit in FCR must be set first before - * other bits are configured */ - /* Enable FIFOs for now at 1-byte, and flush them */ - CT_UART.INTERRUPT_IDENTIFICATION_REGISTER_FIFO_CONTROL_REGISTER = (0x8) | (0x4) | (0x2) | (0x1); - //CT_UART.FCR = (0x80) | (0x4) | (0x2) | (0x01); // 8-byte RX FIFO trigger - - /* Choose desired protocol settings by writing to LCR */ - /* 8-bit word, 1 stop bit, no parity, no break control and no divisor latch */ - CT_UART.LINE_CONTROL_REGISTER = 3; - - /* Enable loopback for test */ - CT_UART.MODEM_CONTROL_REGISTER = 0x00; - - /* Choose desired response to emulation suspend events by configuring - * FREE bit and enable UART by setting UTRST and URRST in PWREMU_MGMT */ - /* Allow UART to run free, enable UART TX/RX */ - CT_UART.POWERMANAGEMENT_AND_EMULATION_REGISTER = 0x6001; - - /*** END INITIALIZATION ***/ - - /* Priming the 'hostbuffer' with a message */ - hostBuffer = "Hello! This is a long string\r\n"; - - /*** SEND SOME DATA ***/ - - /* Let's send/receive some dummy data */ - while(1) { - cnt = 0; - while(1) { - /* Load character, ensure it is not string termination */ - if ((tx = hostBuffer[cnt]) == '\0') - break; - cnt++; - CT_UART.RBR_THR_REGISTERS = tx; - - /* Because we are doing loopback, wait until LSR.DR == 1 - * indicating there is data in the RX FIFO */ - while ((CT_UART.LINE_STATUS_REGISTER & 0x1) == 0x0); - - /* Read the value from RBR */ - rx = CT_UART.RBR_THR_REGISTERS; - - /* Wait for TX FIFO to be empty */ - while (!((CT_UART.INTERRUPT_IDENTIFICATION_REGISTER_FIFO_CONTROL_REGISTER & 0x2) == 0x2)); - } - } - - /*** DONE SENDING DATA ***/ - - /* Disable UART before halting */ - CT_UART.POWERMANAGEMENT_AND_EMULATION_REGISTER = 0x0; - - /* Halt PRU core */ - __halt(); -} diff --git a/books/pru-cookbook/04debug/code/uart2.pru0.c b/books/pru-cookbook/04debug/code/uart2.pru0.c deleted file mode 100644 index 56ca985d..00000000 --- a/books/pru-cookbook/04debug/code/uart2.pru0.c +++ /dev/null @@ -1,126 +0,0 @@ -// From: http://git.ti.com/pru-software-support-package/pru-software-support-package/trees/master/pru_cape/pru_fw/PRU_Hardware_UART - -#include <stdint.h> -#include <pru_uart.h> -#include "resource_table_empty.h" - -/* The FIFO size on the PRU UART is 16 bytes; however, we are (arbitrarily) - * only going to send 8 at a time */ -#define FIFO_SIZE 16 -#define MAX_CHARS 8 -#define BUFFER 40 - -//****************************************************************************** -// Print Message Out -// This function take in a string literal of any size and then fill the -// TX FIFO when it's empty and waits until there is info in the RX FIFO -// before returning. -//****************************************************************************** -void PrintMessageOut(volatile char* Message) -{ - uint8_t cnt, index = 0; - - while (1) { - cnt = 0; - - /* Wait until the TX FIFO and the TX SR are completely empty */ - while (!CT_UART.LSR_bit.TEMT); - - while (Message[index] != NULL && cnt < MAX_CHARS) { - CT_UART.THR = Message[index]; - index++; - cnt++; - } - if (Message[index] == NULL) - break; - } - - /* Wait until the TX FIFO and the TX SR are completely empty */ - while (!CT_UART.LSR_bit.TEMT); - -} - -//****************************************************************************** -// IEP Timer Config -// This function waits until there is info in the RX FIFO and then returns -// the first character entered. -//****************************************************************************** -char ReadMessageIn(void) -{ - while (!CT_UART.LSR_bit.DR); - - return CT_UART.RBR_bit.DATA; -} - -void main(void) -{ - uint32_t i; - volatile uint32_t not_done = 1; - - char rxBuffer[BUFFER]; - rxBuffer[BUFFER-1] = NULL; // null terminate the string - - /*** INITIALIZATION ***/ - - /* Set up UART to function at 115200 baud - DLL divisor is 104 at 16x oversample - * 192MHz / 104 / 16 = ~115200 */ - CT_UART.DLL = 104; - CT_UART.DLH = 0; - CT_UART.MDR_bit.OSM_SEL = 0x0; - - /* Enable Interrupts in UART module. This allows the main thread to poll for - * Receive Data Available and Transmit Holding Register Empty */ - CT_UART.IER = 0x7; - - /* If FIFOs are to be used, select desired trigger level and enable - * FIFOs by writing to FCR. FIFOEN bit in FCR must be set first before - * other bits are configured */ - /* Enable FIFOs for now at 1-byte, and flush them */ - CT_UART.FCR = (0x80) | (0x8) | (0x4) | (0x2) | (0x01); // 8-byte RX FIFO trigger - - /* Choose desired protocol settings by writing to LCR */ - /* 8-bit word, 1 stop bit, no parity, no break control and no divisor latch */ - CT_UART.LCR = 3; - - /* If flow control is desired write appropriate values to MCR. */ - /* No flow control for now, but enable loopback for test */ - CT_UART.MCR = 0x00; - - /* Choose desired response to emulation suspend events by configuring - * FREE bit and enable UART by setting UTRST and URRST in PWREMU_MGMT */ - /* Allow UART to run free, enable UART TX/RX */ - CT_UART.PWREMU_MGMT_bit.FREE = 0x1; - CT_UART.PWREMU_MGMT_bit.URRST = 0x1; - CT_UART.PWREMU_MGMT_bit.UTRST = 0x1; - - /* Turn off RTS and CTS functionality */ - CT_UART.MCR_bit.AFE = 0x0; - CT_UART.MCR_bit.RTS = 0x0; - - /*** END INITIALIZATION ***/ - - while(1) { - /* Print out greeting message */ - PrintMessageOut("Hello you are in the PRU UART demo test please enter some characters\r\n"); - - /* Read in characters from user, then echo them back out */ - for (i = 0; i < BUFFER-1 ; i++) { - rxBuffer[i] = ReadMessageIn(); - if(rxBuffer[i] == '\r') { // Quit early if ENTER is hit. - rxBuffer[i+1] = NULL; - break; - } - } - - PrintMessageOut("you typed:\r\n"); - PrintMessageOut(rxBuffer); - PrintMessageOut("\r\n"); - } - - /*** DONE SENDING DATA ***/ - /* Disable UART before halting */ - CT_UART.PWREMU_MGMT = 0x0; - - /* Halt PRU core */ - __halt(); -} diff --git a/books/pru-cookbook/04debug/code/uart2.pru1_0.c b/books/pru-cookbook/04debug/code/uart2.pru1_0.c deleted file mode 100644 index c934ef7d..00000000 --- a/books/pru-cookbook/04debug/code/uart2.pru1_0.c +++ /dev/null @@ -1,126 +0,0 @@ -// From: http://git.ti.com/pru-software-support-package/pru-software-support-package/trees/master/pru_cape/pru_fw/PRU_Hardware_UART - -#include <stdint.h> -#include <pru_uart.h> -#include "resource_table_empty.h" - -/* The FIFO size on the PRU UART is 16 bytes; however, we are (arbitrarily) - * only going to send 8 at a time */ -#define FIFO_SIZE 16 -#define MAX_CHARS 8 -#define BUFFER 40 - -//****************************************************************************** -// Print Message Out -// This function take in a string literal of any size and then fill the -// TX FIFO when it's empty and waits until there is info in the RX FIFO -// before returning. -//****************************************************************************** -void PrintMessageOut(volatile char* Message) -{ - uint8_t cnt, index = 0; - - while (1) { - cnt = 0; - - /* Wait until the TX FIFO and the TX SR are completely empty */ - while (!CT_UART.LINE_STATUS_REGISTER_bit.TEMT); - - while (Message[index] != NULL && cnt < MAX_CHARS) { - CT_UART.RBR_THR_REGISTERS = Message[index]; - index++; - cnt++; - } - if (Message[index] == NULL) - break; - } - - /* Wait until the TX FIFO and the TX SR are completely empty */ - while (!CT_UART.LINE_STATUS_REGISTER_bit.TEMT); - -} - -//****************************************************************************** -// IEP Timer Config -// This function waits until there is info in the RX FIFO and then returns -// the first character entered. -//****************************************************************************** -char ReadMessageIn(void) -{ - while (!CT_UART.LINE_STATUS_REGISTER_bit.DR); - - return CT_UART.RBR_THR_REGISTERS_bit.DATA; -} - -void main(void) -{ - uint32_t i; - volatile uint32_t not_done = 1; - - char rxBuffer[BUFFER]; - rxBuffer[BUFFER-1] = NULL; // null terminate the string - - /*** INITIALIZATION ***/ - - /* Set up UART to function at 115200 baud - DLL divisor is 104 at 16x oversample - * 192MHz / 104 / 16 = ~115200 */ - CT_UART.DIVISOR_REGISTER_LSB_ = 104; - CT_UART.DIVISOR_REGISTER_MSB_ = 0; - CT_UART.MODE_DEFINITION_REGISTER_bit.OSM_SEL = 0x0; - - /* Enable Interrupts in UART module. This allows the main thread to poll for - * Receive Data Available and Transmit Holding Register Empty */ - CT_UART.INTERRUPT_ENABLE_REGISTER = 0x7; - - /* If FIFOs are to be used, select desired trigger level and enable - * FIFOs by writing to FCR. FIFOEN bit in FCR must be set first before - * other bits are configured */ - /* Enable FIFOs for now at 1-byte, and flush them */ - CT_UART.INTERRUPT_IDENTIFICATION_REGISTER_FIFO_CONTROL_REGISTER = (0x80) | (0x8) | (0x4) | (0x2) | (0x01); // 8-byte RX FIFO trigger - - /* Choose desired protocol settings by writing to LCR */ - /* 8-bit word, 1 stop bit, no parity, no break control and no divisor latch */ - CT_UART.LINE_CONTROL_REGISTER = 3; - - /* If flow control is desired write appropriate values to MCR. */ - /* No flow control for now, but enable loopback for test */ - CT_UART.MODEM_CONTROL_REGISTER = 0x00; - - /* Choose desired response to emulation suspend events by configuring - * FREE bit and enable UART by setting UTRST and URRST in PWREMU_MGMT */ - /* Allow UART to run free, enable UART TX/RX */ - CT_UART.POWERMANAGEMENT_AND_EMULATION_REGISTER_bit.FREE = 0x1; - CT_UART.POWERMANAGEMENT_AND_EMULATION_REGISTER_bit.URRST = 0x1; - CT_UART.POWERMANAGEMENT_AND_EMULATION_REGISTER_bit.UTRST = 0x1; - - /* Turn off RTS and CTS functionality */ - CT_UART.MODEM_CONTROL_REGISTER_bit.AFE = 0x0; - CT_UART.MODEM_CONTROL_REGISTER_bit.RTS = 0x0; - - /*** END INITIALIZATION ***/ - - while(1) { - /* Print out greeting message */ - PrintMessageOut("Hello you are in the PRU UART demo test please enter some characters\r\n"); - - /* Read in characters from user, then echo them back out */ - for (i = 0; i < BUFFER-1 ; i++) { - rxBuffer[i] = ReadMessageIn(); - if(rxBuffer[i] == '\r') { // Quit early if ENTER is hit. - rxBuffer[i+1] = NULL; - break; - } - } - - PrintMessageOut("you typed:\r\n"); - PrintMessageOut(rxBuffer); - PrintMessageOut("\r\n"); - } - - /*** DONE SENDING DATA ***/ - /* Disable UART before halting */ - CT_UART.POWERMANAGEMENT_AND_EMULATION_REGISTER = 0x0; - - /* Halt PRU core */ - __halt(); -} diff --git a/books/pru-cookbook/04debug/code/uart_setup.sh b/books/pru-cookbook/04debug/code/uart_setup.sh deleted file mode 100644 index db11d1f4..00000000 --- a/books/pru-cookbook/04debug/code/uart_setup.sh +++ /dev/null @@ -1,28 +0,0 @@ -export TARGET=uart1.pru0 -echo TARGET=$TARGET - -machine=$(awk '{print $NF}' /proc/device-tree/model) -echo -n $machine -if [ $machine = "Black" ]; then - echo " Found" - # Configure tx - config-pin P9_24 pru_uart - # Configure rx - config-pin P9_26 pru_uart -elif [ $machine = "AI" ]; then - echo " Found" - echo "See AI chapter for configuring via device tree" -elif [ $machine = "Blue" ]; then - echo " Found" -elif [ $machine = "PocketBeagle" ]; then - echo " Found" - # Configure tx - config-pin P1_06 pru_uart - config-pin P2_09 pru_uart - # Configure rx - config-pin P1_12 pru_uart - config-pin P2_11 pru_uart -else - echo " Not Found" - pins="" -fi diff --git a/books/pru-cookbook/05blocks/code/Makefile b/books/pru-cookbook/05blocks/code/Makefile deleted file mode 100644 index a7557fda..00000000 --- a/books/pru-cookbook/05blocks/code/Makefile +++ /dev/null @@ -1 +0,0 @@ -include /var/lib/cloud9/common/Makefile diff --git a/books/pru-cookbook/05blocks/code/copyright.c b/books/pru-cookbook/05blocks/code/copyright.c deleted file mode 100644 index a34918fa..00000000 --- a/books/pru-cookbook/05blocks/code/copyright.c +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ - * - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Texas Instruments Incorporated nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ diff --git a/books/pru-cookbook/05blocks/code/input.pru0.c b/books/pru-cookbook/05blocks/code/input.pru0.c deleted file mode 100644 index 9ed5d3b7..00000000 --- a/books/pru-cookbook/05blocks/code/input.pru0.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - uint32_t led; - uint32_t sw; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - led = 0x1<<0; // P9_31 or P1_36 - sw = 0x1<<7; // P9_25 or P1_29 - - while (1) { - if((__R31&sw) == sw) { - __R30 |= led; // Turn on LED - } else - __R30 &= ~led; // Turn off LED - } -} - diff --git a/books/pru-cookbook/05blocks/code/input_setup.sh b/books/pru-cookbook/05blocks/code/input_setup.sh deleted file mode 100755 index 35a0d9c3..00000000 --- a/books/pru-cookbook/05blocks/code/input_setup.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash -# -export TARGET=input.pru0 -echo TARGET=$TARGET - -# Configure the PRU pins based on which Beagle is running -machine=$(awk '{print $NF}' /proc/device-tree/model) -echo -n $machine -if [ $machine = "Black" ]; then - echo " Found" - config-pin P9_31 pruout - config-pin -q P9_31 - config-pin P9_25 pruin - config-pin -q P9_25 -elif [ $machine = "Blue" ]; then - echo " Found" - pins="" -elif [ $machine = "PocketBeagle" ]; then - echo " Found" - config-pin P1_36 pruout - config-pin -q P1_36 - config-pin P1_29 pruin - config-pin -q P1_29 -else - echo " Not Found" - pins="" -fi diff --git a/books/pru-cookbook/05blocks/code/module/.gitignore b/books/pru-cookbook/05blocks/code/module/.gitignore deleted file mode 100644 index 9b6dfc43..00000000 --- a/books/pru-cookbook/05blocks/code/module/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.ko diff --git a/books/pru-cookbook/05blocks/code/module/Makefile b/books/pru-cookbook/05blocks/code/module/Makefile deleted file mode 100644 index 9ca05d05..00000000 --- a/books/pru-cookbook/05blocks/code/module/Makefile +++ /dev/null @@ -1,25 +0,0 @@ -# Makefile for compiling out-of-tree -# From Free Electrons -# If on the Bone run apt install linux-headers-`uname -r` - -KDIR := /lib/modules/$(shell uname -r)/build - -obj-m += rpmsg_client_sample.o -obj-m += rpmsg_pru.o - -all: - $(MAKE) -C $(KDIR) M=$$PWD - -install: - scp hello*.ko bone:. - -print: - @echo KERNELRELEASE= $(KERNELRELEASE) - @echo CONFIG_EXAMPLES= $(CONFIG_EXAMPLES) - @echo obj-m= $(obj-m) - -clean: - rm -rf .tmp_versions *.o - rm -rf .rpmsg_client_sample* rpmsg_client_sample*.mod.c - rm -rf .rpmsg_pru* rpmsg_pru*.mod.c - rm modules.order Module.symvers .built-in.o.cmd \ No newline at end of file diff --git a/books/pru-cookbook/05blocks/code/module/install.sh b/books/pru-cookbook/05blocks/code/module/install.sh deleted file mode 100755 index 89f497f0..00000000 --- a/books/pru-cookbook/05blocks/code/module/install.sh +++ /dev/null @@ -1,6 +0,0 @@ -# This is a example of ARM to PRU communication from Lab 5 of -# http://processors.wiki.ti.com/index.php/PRU_Training:_Hands-on_Labs#LAB_5:_RPMsg_Communication_between_ARM_and_PRU - -sudo apt install linux-headers-`uname -r` - -wget https://github.com/beagleboard/linux/raw/4.9/drivers/rpmsg/rpmsg_pru.c diff --git a/books/pru-cookbook/05blocks/code/module/rpmsg_client_sample.c b/books/pru-cookbook/05blocks/code/module/rpmsg_client_sample.c deleted file mode 100644 index 72b24524..00000000 --- a/books/pru-cookbook/05blocks/code/module/rpmsg_client_sample.c +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Remote processor messaging - sample client driver - * - * Copyright (C) 2011 Texas Instruments, Inc. - * Copyright (C) 2011 Google, Inc. - * - * Ohad Ben-Cohen <ohad@wizery.com> - * Brian Swetland <swetland@google.com> - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/rpmsg.h> - -#define MSG "hello world!" -#define MSG_LIMIT 10 - -struct instance_data { - int rx_count; -}; - -static int rpmsg_sample_cb(struct rpmsg_device *rpdev, void *data, int len, - void *priv, u32 src) -{ - int ret; - struct instance_data *idata = dev_get_drvdata(&rpdev->dev); - - dev_info(&rpdev->dev, "incoming msg %d (src: 0x%x)\n", - ++idata->rx_count, src); - - print_hex_dump(KERN_DEBUG, __func__, DUMP_PREFIX_NONE, 16, 1, - data, len, true); - - /* samples should not live forever */ - if (idata->rx_count >= MSG_LIMIT) { - dev_info(&rpdev->dev, "goodbye!\n"); - return 0; - } - - /* send a new message now */ - ret = rpmsg_send(rpdev->ept, MSG, strlen(MSG)); - if (ret) - dev_err(&rpdev->dev, "rpmsg_send failed: %d\n", ret); - - return 0; -} - -static int rpmsg_sample_probe(struct rpmsg_device *rpdev) -{ - int ret; - struct instance_data *idata; - - dev_info(&rpdev->dev, "new channel: 0x%x -> 0x%x!\n", - rpdev->src, rpdev->dst); - - idata = devm_kzalloc(&rpdev->dev, sizeof(*idata), GFP_KERNEL); - if (!idata) - return -ENOMEM; - - dev_set_drvdata(&rpdev->dev, idata); - - /* send a message to our remote processor */ - ret = rpmsg_send(rpdev->ept, MSG, strlen(MSG)); - if (ret) { - dev_err(&rpdev->dev, "rpmsg_send failed: %d\n", ret); - return ret; - } - - return 0; -} - -static void rpmsg_sample_remove(struct rpmsg_device *rpdev) -{ - dev_info(&rpdev->dev, "rpmsg sample client driver is removed\n"); -} - -static struct rpmsg_device_id rpmsg_driver_sample_id_table[] = { - { .name = "rpmsg-client-sample" }, - { }, -}; -MODULE_DEVICE_TABLE(rpmsg, rpmsg_driver_sample_id_table); - -static struct rpmsg_driver rpmsg_sample_client = { - .drv.name = KBUILD_MODNAME, - .id_table = rpmsg_driver_sample_id_table, - .probe = rpmsg_sample_probe, - .callback = rpmsg_sample_cb, - .remove = rpmsg_sample_remove, -}; -module_rpmsg_driver(rpmsg_sample_client); - -MODULE_DESCRIPTION("Remote processor messaging sample client driver"); -MODULE_LICENSE("GPL v2"); diff --git a/books/pru-cookbook/05blocks/code/module/rpmsg_pru.c b/books/pru-cookbook/05blocks/code/module/rpmsg_pru.c deleted file mode 100644 index 5a96b209..00000000 --- a/books/pru-cookbook/05blocks/code/module/rpmsg_pru.c +++ /dev/null @@ -1,359 +0,0 @@ -/* - * PRU Remote Processor Messaging Driver - * - * Copyright (C) 2015-2017 Texas Instruments Incorporated - http://www.ti.com/ - * Jason Reeder <jreeder@ti.com> - * Suman Anna <s-anna@ti.com> - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include <linux/kernel.h> -#include <linux/rpmsg.h> -#include <linux/slab.h> -#include <linux/fs.h> -#include <linux/init.h> -#include <linux/cdev.h> -#include <linux/module.h> -#include <linux/kfifo.h> -#include <linux/uaccess.h> -#include <linux/mutex.h> -#include <linux/poll.h> -#include <linux/rpmsg/virtio_rpmsg.h> - -#define PRU_MAX_DEVICES (8) -/* Matches the definition in virtio_rpmsg_bus.c */ -#define RPMSG_BUF_SIZE (512) -#define MAX_FIFO_MSG (32) -#define FIFO_MSG_SIZE RPMSG_BUF_SIZE - -/** - * struct rpmsg_pru_dev - Structure that contains the per-device data - * @rpdev: rpmsg channel device that is associated with this rpmsg_pru device - * @dev: device - * @cdev: character device - * @locked: boolean used to determine whether or not the device file is in use - * @devt: dev_t structure for the rpmsg_pru device - * @msg_fifo: kernel fifo used to buffer the messages between userspace and PRU - * @msg_len: array storing the lengths of each message in the kernel fifo - * @msg_idx_rd: kernel fifo read index - * @msg_idx_wr: kernel fifo write index - * @wait_list: wait queue used to implement the poll operation of the character - * device - * - * Each rpmsg_pru device provides an interface, using an rpmsg channel (rpdev), - * between a user space character device (cdev) and a PRU core. A kernel fifo - * (msg_fifo) is used to buffer the messages in the kernel that are - * being passed between the character device and the PRU. - */ -struct rpmsg_pru_dev { - struct rpmsg_device *rpdev; - struct device *dev; - struct cdev cdev; - bool locked; - dev_t devt; - struct kfifo msg_fifo; - u32 msg_len[MAX_FIFO_MSG]; - int msg_idx_rd; - int msg_idx_wr; - wait_queue_head_t wait_list; -}; - -static struct class *rpmsg_pru_class; -static dev_t rpmsg_pru_devt; -static DEFINE_MUTEX(rpmsg_pru_lock); -static DEFINE_IDR(rpmsg_pru_minors); - -static int rpmsg_pru_open(struct inode *inode, struct file *filp) -{ - struct rpmsg_pru_dev *prudev; - int ret = -EACCES; - - prudev = container_of(inode->i_cdev, struct rpmsg_pru_dev, cdev); - - mutex_lock(&rpmsg_pru_lock); - if (!prudev->locked) { - prudev->locked = true; - filp->private_data = prudev; - ret = 0; - } - mutex_unlock(&rpmsg_pru_lock); - - if (ret) - dev_err(prudev->dev, "Device already open\n"); - - return ret; -} - -static int rpmsg_pru_release(struct inode *inode, struct file *filp) -{ - struct rpmsg_pru_dev *prudev; - - prudev = container_of(inode->i_cdev, struct rpmsg_pru_dev, cdev); - mutex_lock(&rpmsg_pru_lock); - prudev->locked = false; - mutex_unlock(&rpmsg_pru_lock); - return 0; -} - -static ssize_t rpmsg_pru_read(struct file *filp, char __user *buf, - size_t count, loff_t *f_pos) -{ - int ret; - u32 length; - struct rpmsg_pru_dev *prudev; - - prudev = filp->private_data; - - if (kfifo_is_empty(&prudev->msg_fifo) && - (filp->f_flags & O_NONBLOCK)) - return -EAGAIN; - - ret = wait_event_interruptible(prudev->wait_list, - !kfifo_is_empty(&prudev->msg_fifo)); - if (ret) - return -EINTR; - - ret = kfifo_to_user(&prudev->msg_fifo, buf, - prudev->msg_len[prudev->msg_idx_rd], &length); - prudev->msg_idx_rd = (prudev->msg_idx_rd + 1) % MAX_FIFO_MSG; - - return ret ? ret : length; -} - -static ssize_t rpmsg_pru_write(struct file *filp, const char __user *buf, - size_t count, loff_t *f_pos) -{ - int ret; - struct rpmsg_pru_dev *prudev; - static char rpmsg_pru_buf[RPMSG_BUF_SIZE]; - - prudev = filp->private_data; - - if (count > RPMSG_BUF_SIZE - sizeof(struct rpmsg_hdr)) { - dev_err(prudev->dev, "Data too large for RPMsg Buffer\n"); - return -EINVAL; - } - - if (copy_from_user(rpmsg_pru_buf, buf, count)) { - dev_err(prudev->dev, "Error copying buffer from user space"); - return -EFAULT; - } - - ret = rpmsg_send(prudev->rpdev->ept, (void *)rpmsg_pru_buf, count); - if (ret) - dev_err(prudev->dev, "rpmsg_send failed: %d\n", ret); - - return ret ? ret : count; -} - -static unsigned int rpmsg_pru_poll(struct file *filp, - struct poll_table_struct *wait) -{ - int mask; - struct rpmsg_pru_dev *prudev; - - prudev = filp->private_data; - - poll_wait(filp, &prudev->wait_list, wait); - - mask = POLLOUT | POLLWRNORM; - - if (!kfifo_is_empty(&prudev->msg_fifo)) - mask |= POLLIN | POLLRDNORM; - - return mask; -} - -static const struct file_operations rpmsg_pru_fops = { - .owner = THIS_MODULE, - .open = rpmsg_pru_open, - .release = rpmsg_pru_release, - .read = rpmsg_pru_read, - .write = rpmsg_pru_write, - .poll = rpmsg_pru_poll, -}; - -static int rpmsg_pru_cb(struct rpmsg_device *rpdev, void *data, int len, - void *priv, u32 src) -{ - u32 length; - struct rpmsg_pru_dev *prudev; - - prudev = dev_get_drvdata(&rpdev->dev); - - if (kfifo_avail(&prudev->msg_fifo) < len) { - dev_err(&rpdev->dev, "Not enough space on the FIFO\n"); - return -ENOSPC; - } - - if ((prudev->msg_idx_wr + 1) % MAX_FIFO_MSG == - prudev->msg_idx_rd) { - dev_err(&rpdev->dev, "Message length table is full\n"); - return -ENOSPC; - } - - length = kfifo_in(&prudev->msg_fifo, data, len); - prudev->msg_len[prudev->msg_idx_wr] = length; - prudev->msg_idx_wr = (prudev->msg_idx_wr + 1) % MAX_FIFO_MSG; - - wake_up_interruptible(&prudev->wait_list); - - return 0; -} - -static int rpmsg_pru_probe(struct rpmsg_device *rpdev) -{ - int ret; - struct rpmsg_pru_dev *prudev; - int minor_got; - - prudev = devm_kzalloc(&rpdev->dev, sizeof(*prudev), GFP_KERNEL); - if (!prudev) - return -ENOMEM; - - mutex_lock(&rpmsg_pru_lock); - minor_got = idr_alloc(&rpmsg_pru_minors, prudev, 0, PRU_MAX_DEVICES, - GFP_KERNEL); - mutex_unlock(&rpmsg_pru_lock); - if (minor_got < 0) { - ret = minor_got; - dev_err(&rpdev->dev, "Failed to get a minor number for the rpmsg_pru device: %d\n", - ret); - goto fail_alloc_minor; - } - - prudev->devt = MKDEV(MAJOR(rpmsg_pru_devt), minor_got); - - cdev_init(&prudev->cdev, &rpmsg_pru_fops); - prudev->cdev.owner = THIS_MODULE; - ret = cdev_add(&prudev->cdev, prudev->devt, 1); - if (ret) { - dev_err(&rpdev->dev, "Unable to add cdev for the rpmsg_pru device\n"); - goto fail_add_cdev; - } - - prudev->dev = device_create(rpmsg_pru_class, &rpdev->dev, prudev->devt, - NULL, "rpmsg_pru%d", rpdev->dst); - if (IS_ERR(prudev->dev)) { - dev_err(&rpdev->dev, "Unable to create the rpmsg_pru device\n"); - ret = PTR_ERR(prudev->dev); - goto fail_create_device; - } - - prudev->rpdev = rpdev; - - ret = kfifo_alloc(&prudev->msg_fifo, MAX_FIFO_MSG * FIFO_MSG_SIZE, - GFP_KERNEL); - if (ret) { - dev_err(&rpdev->dev, "Unable to allocate fifo for the rpmsg_pru device\n"); - goto fail_alloc_fifo; - } - - init_waitqueue_head(&prudev->wait_list); - - dev_set_drvdata(&rpdev->dev, prudev); - - dev_info(&rpdev->dev, "new rpmsg_pru device: /dev/rpmsg_pru%d", - rpdev->dst); - - return 0; - -fail_alloc_fifo: - device_destroy(rpmsg_pru_class, prudev->devt); -fail_create_device: - cdev_del(&prudev->cdev); -fail_add_cdev: - mutex_lock(&rpmsg_pru_lock); - idr_remove(&rpmsg_pru_minors, minor_got); - mutex_unlock(&rpmsg_pru_lock); -fail_alloc_minor: - return ret; -} - -static void rpmsg_pru_remove(struct rpmsg_device *rpdev) -{ - struct rpmsg_pru_dev *prudev; - - prudev = dev_get_drvdata(&rpdev->dev); - - kfifo_free(&prudev->msg_fifo); - device_destroy(rpmsg_pru_class, prudev->devt); - cdev_del(&prudev->cdev); - mutex_lock(&rpmsg_pru_lock); - idr_remove(&rpmsg_pru_minors, MINOR(prudev->devt)); - mutex_unlock(&rpmsg_pru_lock); -} - -/* .name matches on RPMsg Channels and causes a probe */ -static const struct rpmsg_device_id rpmsg_driver_pru_id_table[] = { - { .name = "rpmsg-pru" }, - { }, -}; -MODULE_DEVICE_TABLE(rpmsg, rpmsg_driver_pru_id_table); - -static struct rpmsg_driver rpmsg_pru_driver = { - .drv.name = KBUILD_MODNAME, - .id_table = rpmsg_driver_pru_id_table, - .probe = rpmsg_pru_probe, - .callback = rpmsg_pru_cb, - .remove = rpmsg_pru_remove, -}; - -static int __init rpmsg_pru_init(void) -{ - int ret; - - rpmsg_pru_class = class_create(THIS_MODULE, "rpmsg_pru"); - if (IS_ERR(rpmsg_pru_class)) { - pr_err("Unable to create class\n"); - ret = PTR_ERR(rpmsg_pru_class); - goto fail_create_class; - } - - ret = alloc_chrdev_region(&rpmsg_pru_devt, 0, PRU_MAX_DEVICES, - "rpmsg_pru"); - if (ret) { - pr_err("Unable to allocate chrdev region\n"); - goto fail_alloc_region; - } - - ret = register_rpmsg_driver(&rpmsg_pru_driver); - if (ret) { - pr_err("Unable to register rpmsg driver"); - goto fail_register_rpmsg_driver; - } - - return 0; - -fail_register_rpmsg_driver: - unregister_chrdev_region(rpmsg_pru_devt, PRU_MAX_DEVICES); -fail_alloc_region: - class_destroy(rpmsg_pru_class); -fail_create_class: - return ret; -} - -static void __exit rpmsg_pru_exit(void) -{ - unregister_rpmsg_driver(&rpmsg_pru_driver); - idr_destroy(&rpmsg_pru_minors); - mutex_destroy(&rpmsg_pru_lock); - class_destroy(rpmsg_pru_class); - unregister_chrdev_region(rpmsg_pru_devt, PRU_MAX_DEVICES); -} - -module_init(rpmsg_pru_init); -module_exit(rpmsg_pru_exit); - -MODULE_AUTHOR("Jason Reeder <jreeder@ti.com>"); -MODULE_ALIAS("rpmsg:rpmsg-pru"); -MODULE_DESCRIPTION("PRU Remote Processor Messaging Driver"); -MODULE_LICENSE("GPL v2"); diff --git a/books/pru-cookbook/05blocks/code/module/setup.sh b/books/pru-cookbook/05blocks/code/module/setup.sh deleted file mode 100755 index 3b313b36..00000000 --- a/books/pru-cookbook/05blocks/code/module/setup.sh +++ /dev/null @@ -1 +0,0 @@ -insmod rpmsg_pru.ko diff --git a/books/pru-cookbook/05blocks/code/neo-colors.py b/books/pru-cookbook/05blocks/code/neo-colors.py deleted file mode 100755 index 736a47b3..00000000 --- a/books/pru-cookbook/05blocks/code/neo-colors.py +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/python3 -from time import sleep -import math - -length = 24 -max = 25 - -# Open a file -fo = open("/dev/rpmsg_pru30", "wb", 0) - -colors = [[1,0,0],[1,1,0],[0,1,0],[0,1,1],[0,0,1],[1,0,1]]# colors = [[1,0,0],[1,0,0]] - -oldr=0 -oldb=0 -oldg=0 - -while True: - for color in colors: - newr = color[0] - newg = color[1] - newb = color[2] - maxtime=20 - for time in range(0, maxtime): - r = (max*oldr+(newr-oldr)*max*time/maxtime) - g = (max*oldg+(newg-oldg)*max*time/maxtime) - b = (max*oldb+(newb-oldb)*max*time/maxtime) - for i in range(0, length): - fo.write(b"%d %d %d %d\n" % (i, r, g, b)) - # print("0 0 127 %d" % (i)) - fo.write(b"-1 0 0 0\n"); # Send colors to LEDs - - # print (r,g,b) - - sleep(0.05) - - oldr=newr - oldg=newg - oldb=newb - -# Close opened file -fo.close() \ No newline at end of file diff --git a/books/pru-cookbook/05blocks/code/neo-rainbow.py b/books/pru-cookbook/05blocks/code/neo-rainbow.py deleted file mode 100755 index ffd706a6..00000000 --- a/books/pru-cookbook/05blocks/code/neo-rainbow.py +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/python3 -from time import sleep -import math - -len = 24 -amp = 12 -f = 25 -shift = 3 -phase = 0 - -# Open a file -fo = open("/dev/rpmsg_pru30", "wb", 0) - -while True: - for i in range(0, len): - r = (amp * (math.sin(2*math.pi*f*(i-phase-0*shift)/len) + 1)) + 1; - g = (amp * (math.sin(2*math.pi*f*(i-phase-1*shift)/len) + 1)) + 1; - b = (amp * (math.sin(2*math.pi*f*(i-phase-2*shift)/len) + 1)) + 1; - fo.write(b"%d %d %d %d\n" % (i, r, g, b)) - # print("0 0 127 %d" % (i)) - - fo.write(b"-1 0 0 0\n"); - phase = phase + 1 - sleep(0.05) - -# Close opened file -fo.close() \ No newline at end of file diff --git a/books/pru-cookbook/05blocks/code/neo1.pru0.c b/books/pru-cookbook/05blocks/code/neo1.pru0.c deleted file mode 100644 index 5f2ce824..00000000 --- a/books/pru-cookbook/05blocks/code/neo1.pru0.c +++ /dev/null @@ -1,44 +0,0 @@ -// Control a ws2812 (NeoPixel) display, All on or all off -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" - -#define STR_LEN 24 -#define oneCyclesOn 700/5 // Stay on 700ns -#define oneCyclesOff 800/5 -#define zeroCyclesOn 350/5 -#define zeroCyclesOff 600/5 -#define resetCycles 60000/5 // Must be at least 50u, use 60u -#define gpio P9_29 // output pin - -#define ONE - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - uint32_t i; - for(i=0; i<STR_LEN*3*8; i++) { -#ifdef ONE - __R30 |= gpio; // Set the GPIO pin to 1 - __delay_cycles(oneCyclesOn-1); - __R30 &= ~gpio; // Clear the GPIO pin - __delay_cycles(oneCyclesOff-2); -#else - __R30 |= gpio; // Set the GPIO pin to 1 - __delay_cycles(zeroCyclesOn-1); - __R30 &= ~gpio; // Clear the GPIO pin - __delay_cycles(zeroCyclesOff-2); -#endif - } - // Send Reset - __R30 &= ~gpio; // Clear the GPIO pin - __delay_cycles(resetCycles); - - __halt(); -} diff --git a/books/pru-cookbook/05blocks/code/neo1.pru1_1.c b/books/pru-cookbook/05blocks/code/neo1.pru1_1.c deleted file mode 100644 index 2ad8d56d..00000000 --- a/books/pru-cookbook/05blocks/code/neo1.pru1_1.c +++ /dev/null @@ -1,44 +0,0 @@ -// Control a ws2812 (NeoPixel) display, All on or all off -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" - -#define STR_LEN 24 -#define oneCyclesOn 700/5 // Stay on 700ns -#define oneCyclesOff 800/5 -#define zeroCyclesOn 350/5 -#define zeroCyclesOff 600/5 -#define resetCycles 60000/5 // Must be at least 50u, use 60u -#define gpio P9_16 // output pin - -#define ONE - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - uint32_t i; - for(i=0; i<STR_LEN*3*8; i++) { -#ifdef ONE - __R30 |= gpio; // Set the GPIO pin to 1 - __delay_cycles(oneCyclesOn-1); - __R30 &= ~gpio; // Clear the GPIO pin - __delay_cycles(oneCyclesOff-2); -#else - __R30 |= gpio; // Set the GPIO pin to 1 - __delay_cycles(zeroCyclesOn-1); - __R30 &= ~gpio; // Clear the GPIO pin - __delay_cycles(zeroCyclesOff-2); -#endif - } - // Send Reset - __R30 &= ~gpio; // Clear the GPIO pin - __delay_cycles(resetCycles); - - __halt(); -} diff --git a/books/pru-cookbook/05blocks/code/neo2.pru0.c b/books/pru-cookbook/05blocks/code/neo2.pru0.c deleted file mode 100644 index a30077ce..00000000 --- a/books/pru-cookbook/05blocks/code/neo2.pru0.c +++ /dev/null @@ -1,46 +0,0 @@ -// Control a ws2812 (neo pixel) display, green, red, blue, green, ... -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" - -#define STR_LEN 3 -#define oneCyclesOn 700/5 // Stay on 700ns -#define oneCyclesOff 800/5 -#define zeroCyclesOn 350/5 -#define zeroCyclesOff 600/5 -#define resetCycles 60000/5 // Must be at least 50u, use 60u -#define gpio P9_29 // output pin - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - uint32_t color[STR_LEN] = {0x0f0000, 0x000f00, 0x0000f}; // green, red, blue - int i, j; - - for(j=0; j<STR_LEN; j++) { - for(i=23; i>=0; i--) { - if(color[j] & (0x1<<i)) { - __R30 |= gpio; // Set the GPIO pin to 1 - __delay_cycles(oneCyclesOn-1); - __R30 &= ~gpio; // Clear the GPIO pin - __delay_cycles(oneCyclesOff-2); - } else { - __R30 |= gpio; // Set the GPIO pin to 1 - __delay_cycles(zeroCyclesOn-1); - __R30 &= ~gpio; // Clear the GPIO pin - __delay_cycles(zeroCyclesOff-2); - } - } - } - // Send Reset - __R30 &= ~gpio; // Clear the GPIO pin - __delay_cycles(resetCycles); - - __halt(); -} diff --git a/books/pru-cookbook/05blocks/code/neo2.pru1_1.c b/books/pru-cookbook/05blocks/code/neo2.pru1_1.c deleted file mode 100644 index 6b243dcf..00000000 --- a/books/pru-cookbook/05blocks/code/neo2.pru1_1.c +++ /dev/null @@ -1,46 +0,0 @@ -// Control a ws2812 (neo pixel) display, green, red, blue, green, ... -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" - -#define STR_LEN 3 -#define oneCyclesOn 700/5 // Stay on 700ns -#define oneCyclesOff 800/5 -#define zeroCyclesOn 350/5 -#define zeroCyclesOff 600/5 -#define resetCycles 60000/5 // Must be at least 50u, use 60u -#define gpio P9_16 // output pin - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - uint32_t color[STR_LEN] = {0x0f0000, 0x000f00, 0x0000f}; // green, red, blue - int i, j; - - for(j=0; j<STR_LEN; j++) { - for(i=23; i>=0; i--) { - if(color[j] & (0x1<<i)) { - __R30 |= gpio; // Set the GPIO pin to 1 - __delay_cycles(oneCyclesOn-1); - __R30 &= ~gpio; // Clear the GPIO pin - __delay_cycles(oneCyclesOff-2); - } else { - __R30 |= gpio; // Set the GPIO pin to 1 - __delay_cycles(zeroCyclesOn-1); - __R30 &= ~gpio; // Clear the GPIO pin - __delay_cycles(zeroCyclesOff-2); - } - } - } - // Send Reset - __R30 &= ~gpio; // Clear the GPIO pin - __delay_cycles(resetCycles); - - __halt(); -} diff --git a/books/pru-cookbook/05blocks/code/neo3.pru0.c b/books/pru-cookbook/05blocks/code/neo3.pru0.c deleted file mode 100644 index 8c1a9f13..00000000 --- a/books/pru-cookbook/05blocks/code/neo3.pru0.c +++ /dev/null @@ -1,67 +0,0 @@ -// Control a ws2812 (neo pixel) display, green, red, blue, green, ... -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" - -#define STR_LEN 24 -#define oneCyclesOn 700/5 // Stay on 700ns -#define oneCyclesOff 800/5 -#define zeroCyclesOn 350/5 -#define zeroCyclesOff 600/5 -#define resetCycles 60000/5 // Must be at least 50u, use 60u -#define gpio P9_29 // output pin - -#define SPEED 20000000/5 // Time to wait between updates - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - uint32_t background = 0x00000f; - uint32_t foreground = 0x000f00; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - uint32_t color[STR_LEN]; // green, red, blue - int i, j; - int k, oldk = 0;; - // Set everything to background - for(i=0; i<STR_LEN; i++) { - color[i] = background; - } - - while(1) { - // Move forward one position - for(k=0; k<STR_LEN; k++) { - color[oldk] = background; - color[k] = foreground; - oldk=k; - - // Output the string - for(j=0; j<STR_LEN; j++) { - for(i=23; i>=0; i--) { - if(color[j] & (0x1<<i)) { - __R30 |= gpio; // Set the GPIO pin to 1 - __delay_cycles(oneCyclesOn-1); - __R30 &= ~gpio; // Clear the GPIO pin - __delay_cycles(oneCyclesOff-2); - } else { - __R30 |= gpio; // Set the GPIO pin to 1 - __delay_cycles(zeroCyclesOn-1); - __R30 &= ~gpio; // Clear the GPIO pin - __delay_cycles(zeroCyclesOff-2); - } - } - } - // Send Reset - __R30 &= ~gpio; // Clear the GPIO pin - __delay_cycles(resetCycles); - - // Wait - __delay_cycles(SPEED); - } - } -} diff --git a/books/pru-cookbook/05blocks/code/neo3.pru1_1.c b/books/pru-cookbook/05blocks/code/neo3.pru1_1.c deleted file mode 100644 index ee8dd638..00000000 --- a/books/pru-cookbook/05blocks/code/neo3.pru1_1.c +++ /dev/null @@ -1,67 +0,0 @@ -// Control a ws2812 (neo pixel) display, green, red, blue, green, ... -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" - -#define STR_LEN 24 -#define oneCyclesOn 700/5 // Stay on 700ns -#define oneCyclesOff 800/5 -#define zeroCyclesOn 350/5 -#define zeroCyclesOff 600/5 -#define resetCycles 60000/5 // Must be at least 50u, use 60u -#define gpio P9_16 // output pin - -#define SPEED 20000000/5 // Time to wait between updates - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - uint32_t background = 0x00000f; - uint32_t foreground = 0x000f00; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - uint32_t color[STR_LEN]; // green, red, blue - int i, j; - int k, oldk = 0;; - // Set everything to background - for(i=0; i<STR_LEN; i++) { - color[i] = background; - } - - while(1) { - // Move forward one position - for(k=0; k<STR_LEN; k++) { - color[oldk] = background; - color[k] = foreground; - oldk=k; - - // Output the string - for(j=0; j<STR_LEN; j++) { - for(i=23; i>=0; i--) { - if(color[j] & (0x1<<i)) { - __R30 |= gpio; // Set the GPIO pin to 1 - __delay_cycles(oneCyclesOn-1); - __R30 &= ~gpio; // Clear the GPIO pin - __delay_cycles(oneCyclesOff-2); - } else { - __R30 |= gpio; // Set the GPIO pin to 1 - __delay_cycles(zeroCyclesOn-1); - __R30 &= ~gpio; // Clear the GPIO pin - __delay_cycles(zeroCyclesOff-2); - } - } - } - // Send Reset - __R30 &= ~gpio; // Clear the GPIO pin - __delay_cycles(resetCycles); - - // Wait - __delay_cycles(SPEED); - } - } -} diff --git a/books/pru-cookbook/05blocks/code/neo4.pru0.c b/books/pru-cookbook/05blocks/code/neo4.pru0.c deleted file mode 100644 index 7fb54557..00000000 --- a/books/pru-cookbook/05blocks/code/neo4.pru0.c +++ /dev/null @@ -1,145 +0,0 @@ -// Use rpmsg to control the NeoPixels via /dev/rpmsg_pru30 -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> // atoi -#include <string.h> -#include <pru_cfg.h> -#include <pru_intc.h> -#include <rsc_types.h> -#include <pru_rpmsg.h> -#include "resource_table_0.h" -#include "prugpio.h" - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -/* Host-0 Interrupt sets bit 30 in register R31 */ -#define HOST_INT ((uint32_t) 1 << 30) - -/* The PRU-ICSS system events used for RPMsg are defined in the Linux device tree - * PRU0 uses system event 16 (To ARM) and 17 (From ARM) - * PRU1 uses system event 18 (To ARM) and 19 (From ARM) - */ -#define TO_ARM_HOST 16 -#define FROM_ARM_HOST 17 - -/* -* Using the name 'rpmsg-pru' will probe the rpmsg_pru driver found -* at linux-x.y.z/drivers/rpmsg/rpmsg_pru.c -*/ -#define CHAN_NAME "rpmsg-pru" -#define CHAN_DESC "Channel 30" -#define CHAN_PORT 30 - -/* - * Used to make sure the Linux drivers are ready for RPMsg communication - * Found at linux-x.y.z/include/uapi/linux/virtio_config.h - */ -#define VIRTIO_CONFIG_S_DRIVER_OK 4 - -char payload[RPMSG_BUF_SIZE]; - -#define STR_LEN 24 -#define oneCyclesOn 700/5 // Stay on for 700ns -#define oneCyclesOff 600/5 -#define zeroCyclesOn 350/5 -#define zeroCyclesOff 800/5 -#define resetCycles 51000/5 // Must be at least 50u, use 51u -#define out P9_29 // Bit number to output on - -#define SPEED 20000000/5 // Time to wait between updates - -uint32_t color[STR_LEN]; // green, red, blue - -/* - * main.c - */ -void main(void) -{ - struct pru_rpmsg_transport transport; - uint16_t src, dst, len; - volatile uint8_t *status; - - uint8_t r, g, b; - int i, j; - // Set everything to background - for(i=0; i<STR_LEN; i++) { - color[i] = 0x010000; - } - - /* Allow OCP master port access by the PRU so the PRU can read external memories */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - /* Clear the status of the PRU-ICSS system event that the ARM will use to 'kick' us */ -#ifdef CHIP_IS_am57xx - CT_INTC.SICR_bit.STATUS_CLR_INDEX = FROM_ARM_HOST; -#else - CT_INTC.SICR_bit.STS_CLR_IDX = FROM_ARM_HOST; -#endif - - /* Make sure the Linux drivers are ready for RPMsg communication */ - status = &resourceTable.rpmsg_vdev.status; - while (!(*status & VIRTIO_CONFIG_S_DRIVER_OK)); - - /* Initialize the RPMsg transport structure */ - pru_rpmsg_init(&transport, &resourceTable.rpmsg_vring0, &resourceTable.rpmsg_vring1, TO_ARM_HOST, FROM_ARM_HOST); - - /* Create the RPMsg channel between the PRU and ARM user space using the transport structure. */ - while (pru_rpmsg_channel(RPMSG_NS_CREATE, &transport, CHAN_NAME, CHAN_DESC, CHAN_PORT) != PRU_RPMSG_SUCCESS); - while (1) { - /* Check bit 30 of register R31 to see if the ARM has kicked us */ - if (__R31 & HOST_INT) { - /* Clear the event status */ -#ifdef CHIP_IS_am57xx - CT_INTC.SICR_bit.STATUS_CLR_INDEX = FROM_ARM_HOST; -#else - CT_INTC.SICR_bit.STS_CLR_IDX = FROM_ARM_HOST; -#endif - /* Receive all available messages, multiple messages can be sent per kick */ - while (pru_rpmsg_receive(&transport, &src, &dst, payload, &len) == PRU_RPMSG_SUCCESS) { - char *ret; // rest of payload after front character is removed - int index; // index of LED to control - // Input format is: index red green blue - index = atoi(payload); - // Update the array, but don't write it out. - if((index >=0) & (index < STR_LEN)) { - ret = strchr(payload, ' '); // Skip over index - r = strtol(&ret[1], NULL, 0); - ret = strchr(&ret[1], ' '); // Skip over r, etc. - g = strtol(&ret[1], NULL, 0); - ret = strchr(&ret[1], ' '); - b = strtol(&ret[1], NULL, 0); - - color[index] = (g<<16)|(r<<8)|b; // String wants GRB - } - // When index is -1, send the array to the LED string - if(index == -1) { - // Output the string - for(j=0; j<STR_LEN; j++) { - // Cycle through each bit - for(i=23; i>=0; i--) { - if(color[j] & (0x1<<i)) { - __R30 |= out; // Set the GPIO pin to 1 - __delay_cycles(oneCyclesOn-1); - __R30 &= ~out; // Clear the GPIO pin - __delay_cycles(oneCyclesOff-14); - } else { - __R30 |= out; // Set the GPIO pin to 1 - __delay_cycles(zeroCyclesOn-1); - __R30 &= ~(out); // Clear the GPIO pin - __delay_cycles(zeroCyclesOff-14); - } - } - } - // Send Reset - __R30 &= ~out; // Clear the GPIO pin - __delay_cycles(resetCycles); - - // Wait - __delay_cycles(SPEED); - } - - } - } - } -} diff --git a/books/pru-cookbook/05blocks/code/neo4.pru1_1.c b/books/pru-cookbook/05blocks/code/neo4.pru1_1.c deleted file mode 100644 index 7c120937..00000000 --- a/books/pru-cookbook/05blocks/code/neo4.pru1_1.c +++ /dev/null @@ -1,145 +0,0 @@ -// Use rpmsg to control the NeoPixels via /dev/rpmsg_pru30 -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> // atoi -#include <string.h> -#include <pru_cfg.h> -#include <pru_intc.h> -#include <rsc_types.h> -#include <pru_rpmsg.h> -#include "resource_table_1.h" -#include "prugpio.h" - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -/* Host-1 Interrupt sets bit 31 in register R31 */ -#define HOST_INT ((uint32_t) 1 << 31) - -/* The PRU-ICSS system events used for RPMsg are defined in the Linux device tree - * PRU0 uses system event 16 (To ARM) and 17 (From ARM) - * PRU1 uses system event 18 (To ARM) and 19 (From ARM) - */ -#define TO_ARM_HOST 18 -#define FROM_ARM_HOST 19 - -/* -* Using the name 'rpmsg-pru' will probe the rpmsg_pru driver found -* at linux-x.y.z/drivers/rpmsg/rpmsg_pru.c -*/ -#define CHAN_NAME "rpmsg-pru" -#define CHAN_DESC "Channel 31" -#define CHAN_PORT 31 - -/* - * Used to make sure the Linux drivers are ready for RPMsg communication - * Found at linux-x.y.z/include/uapi/linux/virtio_config.h - */ -#define VIRTIO_CONFIG_S_DRIVER_OK 4 - -char payload[RPMSG_BUF_SIZE]; - -#define STR_LEN 24 -#define oneCyclesOn 700/5 // Stay on for 700ns -#define oneCyclesOff 600/5 -#define zeroCyclesOn 350/5 -#define zeroCyclesOff 800/5 -#define resetCycles 51000/5 // Must be at least 50u, use 51u -#define out P9_16 // Bit number to output on - -#define SPEED 20000000/5 // Time to wait between updates - -uint32_t color[STR_LEN]; // green, red, blue - -/* - * main.c - */ -void main(void) -{ - struct pru_rpmsg_transport transport; - uint16_t src, dst, len; - volatile uint8_t *status; - - uint8_t r, g, b; - int i, j; - // Set everything to background - for(i=0; i<STR_LEN; i++) { - color[i] = 0x010000; - } - - /* Allow OCP master port access by the PRU so the PRU can read external memories */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - /* Clear the status of the PRU-ICSS system event that the ARM will use to 'kick' us */ -#ifdef CHIP_IS_am57xx - CT_INTC.SICR_bit.STATUS_CLR_INDEX = FROM_ARM_HOST; -#else - CT_INTC.SICR_bit.STS_CLR_IDX = FROM_ARM_HOST; -#endif - - /* Make sure the Linux drivers are ready for RPMsg communication */ - status = &resourceTable.rpmsg_vdev.status; - while (!(*status & VIRTIO_CONFIG_S_DRIVER_OK)); - - /* Initialize the RPMsg transport structure */ - pru_rpmsg_init(&transport, &resourceTable.rpmsg_vring0, &resourceTable.rpmsg_vring1, TO_ARM_HOST, FROM_ARM_HOST); - - /* Create the RPMsg channel between the PRU and ARM user space using the transport structure. */ - while (pru_rpmsg_channel(RPMSG_NS_CREATE, &transport, CHAN_NAME, CHAN_DESC, CHAN_PORT) != PRU_RPMSG_SUCCESS); - while (1) { - /* Check bit 30 of register R31 to see if the ARM has kicked us */ - if (__R31 & HOST_INT) { - /* Clear the event status */ -#ifdef CHIP_IS_am57xx - CT_INTC.SICR_bit.STATUS_CLR_INDEX = FROM_ARM_HOST; -#else - CT_INTC.SICR_bit.STS_CLR_IDX = FROM_ARM_HOST; -#endif - /* Receive all available messages, multiple messages can be sent per kick */ - while (pru_rpmsg_receive(&transport, &src, &dst, payload, &len) == PRU_RPMSG_SUCCESS) { - char *ret; // rest of payload after front character is removed - int index; // index of LED to control - // Input format is: index red green blue - index = atoi(payload); - // Update the array, but don't write it out. - if((index >=0) & (index < STR_LEN)) { - ret = strchr(payload, ' '); // Skip over index - r = strtol(&ret[1], NULL, 0); - ret = strchr(&ret[1], ' '); // Skip over r, etc. - g = strtol(&ret[1], NULL, 0); - ret = strchr(&ret[1], ' '); - b = strtol(&ret[1], NULL, 0); - - color[index] = (g<<16)|(r<<8)|b; // String wants GRB - } - // When index is -1, send the array to the LED string - if(index == -1) { - // Output the string - for(j=0; j<STR_LEN; j++) { - // Cycle through each bit - for(i=23; i>=0; i--) { - if(color[j] & (0x1<<i)) { - __R30 |= out; // Set the GPIO pin to 1 - __delay_cycles(oneCyclesOn-1); - __R30 &= ~out; // Clear the GPIO pin - __delay_cycles(oneCyclesOff-14); - } else { - __R30 |= out; // Set the GPIO pin to 1 - __delay_cycles(zeroCyclesOn-1); - __R30 &= ~(out); // Clear the GPIO pin - __delay_cycles(zeroCyclesOff-14); - } - } - } - // Send Reset - __R30 &= ~out; // Clear the GPIO pin - __delay_cycles(resetCycles); - - // Wait - __delay_cycles(SPEED); - } - - } - } - } -} diff --git a/books/pru-cookbook/05blocks/code/neo_setup.sh b/books/pru-cookbook/05blocks/code/neo_setup.sh deleted file mode 100755 index 8f98cbb2..00000000 --- a/books/pru-cookbook/05blocks/code/neo_setup.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -# -export TARGET=neo1.pru0 -echo TARGET=$TARGET - -# Configure the PRU pins based on which Beagle is running -machine=$(awk '{print $NF}' /proc/device-tree/model) -echo -n $machine -if [ $machine = "Black" ]; then - echo " Found" - pins="P9_29 " -elif [ $machine = "Blue" ]; then - echo " Found" - pins="" -elif [ $machine = "PocketBeagle" ]; then - echo " Found" - pins="P1_33" -else - echo " Not Found" - pins="" -fi - -for pin in $pins -do - echo $pin - config-pin $pin pruout - config-pin -q $pin -done diff --git a/books/pru-cookbook/05blocks/code/pwm-test.c b/books/pru-cookbook/05blocks/code/pwm-test.c deleted file mode 100644 index 3bff5f71..00000000 --- a/books/pru-cookbook/05blocks/code/pwm-test.c +++ /dev/null @@ -1,74 +0,0 @@ -/* - * - * pwm tester - * The on cycle and off cycles are stored in each PRU's Data memory - * - */ - -#include <stdio.h> -#include <fcntl.h> -#include <sys/mman.h> - -#define MAXCH 4 - -#define PRU_ADDR 0x4A300000 // Start of PRU memory Page 184 am335x TRM -#define PRU_LEN 0x80000 // Length of PRU memory -#define PRU0_DRAM 0x00000 // Offset to DRAM -#define PRU1_DRAM 0x02000 -#define PRU_SHAREDMEM 0x10000 // Offset to shared memory - -unsigned int *pru0DRAM_32int_ptr; // Points to the start of local DRAM -unsigned int *pru1DRAM_32int_ptr; // Points to the start of local DRAM -unsigned int *prusharedMem_32int_ptr; // Points to the start of the shared memory - -/******************************************************************************* -* int start_pwm_count(int ch, int countOn, int countOff) -* -* Starts a pwm pulse on for countOn and off for countOff to a single channel (ch) -*******************************************************************************/ -int start_pwm_count(int ch, int countOn, int countOff) { - unsigned int *pruDRAM_32int_ptr = pru0DRAM_32int_ptr; - - printf("countOn: %d, countOff: %d, count: %d\n", - countOn, countOff, countOn+countOff); - // write to PRU shared memory - pruDRAM_32int_ptr[2*(ch)+0] = countOn; // On time - pruDRAM_32int_ptr[2*(ch)+1] = countOff; // Off time - return 0; -} - -int main(int argc, char *argv[]) -{ - unsigned int *pru; // Points to start of PRU memory. - int fd; - printf("Servo tester\n"); - - fd = open ("/dev/mem", O_RDWR | O_SYNC); - if (fd == -1) { - printf ("ERROR: could not open /dev/mem.\n\n"); - return 1; - } - pru = mmap (0, PRU_LEN, PROT_READ | PROT_WRITE, MAP_SHARED, fd, PRU_ADDR); - if (pru == MAP_FAILED) { - printf ("ERROR: could not map memory.\n\n"); - return 1; - } - close(fd); - printf ("Using /dev/mem.\n"); - - pru0DRAM_32int_ptr = pru + PRU0_DRAM/4 + 0x200/4; // Points to 0x200 of PRU0 memory - pru1DRAM_32int_ptr = pru + PRU1_DRAM/4 + 0x200/4; // Points to 0x200 of PRU1 memory - prusharedMem_32int_ptr = pru + PRU_SHAREDMEM/4; // Points to start of shared memory - - int i; - for(i=0; i<MAXCH; i++) { - start_pwm_count(i, i+1, 20-(i+1)); - } - - if(munmap(pru, PRU_LEN)) { - printf("munmap failed\n"); - } else { - printf("munmap succeeded\n"); - } -} - diff --git a/books/pru-cookbook/05blocks/code/pwm1.pru0.c b/books/pru-cookbook/05blocks/code/pwm1.pru0.c deleted file mode 100644 index 2ea5caa1..00000000 --- a/books/pru-cookbook/05blocks/code/pwm1.pru0.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - uint32_t gpio = P9_31; // Select which pin to toggle.; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - while(1) { - __R30 |= gpio; // Set the GPIO pin to 1 - __delay_cycles(100000000); - __R30 &= ~gpio; // Clear the GPIO pin - __delay_cycles(100000000); - } -} diff --git a/books/pru-cookbook/05blocks/code/pwm1.pru1_1.c b/books/pru-cookbook/05blocks/code/pwm1.pru1_1.c deleted file mode 100644 index 1f8b737e..00000000 --- a/books/pru-cookbook/05blocks/code/pwm1.pru1_1.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - uint32_t gpio = P9_16; // Select which pin to toggle.; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - while(1) { - __R30 |= gpio; // Set the GPIO pin to 1 - __delay_cycles(100000000); - __R30 &= ~gpio; // Clear the GPIO pin - __delay_cycles(100000000); - } -} diff --git a/books/pru-cookbook/05blocks/code/pwm2.pru0.c b/books/pru-cookbook/05blocks/code/pwm2.pru0.c deleted file mode 100644 index bfa0d076..00000000 --- a/books/pru-cookbook/05blocks/code/pwm2.pru0.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - uint32_t gpio = P9_31; // Select which pin to toggle.; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - while (1) { - __R30 |= gpio; // Set the GPIO pin to 1 - __delay_cycles(1); // Delay one cycle to correct for loop time - __R30 &= ~gpio; // Clear the GPIO pin - __delay_cycles(0); - } -} diff --git a/books/pru-cookbook/05blocks/code/pwm3.pru0.c b/books/pru-cookbook/05blocks/code/pwm3.pru0.c deleted file mode 100644 index 4b2955a0..00000000 --- a/books/pru-cookbook/05blocks/code/pwm3.pru0.c +++ /dev/null @@ -1,43 +0,0 @@ -// This code does MAXCH parallel PWM channels. -// It's period is 3 us -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" - -#define MAXCH 4 // Maximum number of channels - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - uint32_t ch; - uint32_t on[] = {1, 2, 3, 4}; // Number of cycles to stay on - uint32_t off[] = {4, 3, 2, 1}; // Number to stay off - uint32_t onCount[MAXCH]; // Current count - uint32_t offCount[MAXCH]; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - // Initialize the channel counters. - for(ch=0; ch<MAXCH; ch++) { - onCount[ch] = on[ch]; - offCount[ch]= off[ch]; - } - - while (1) { - for(ch=0; ch<MAXCH; ch++) { - if(onCount[ch]) { - onCount[ch]--; - __R30 |= 0x1<<ch; // Set the GPIO pin to 1 - } else if(offCount[ch]) { - offCount[ch]--; - __R30 &= ~(0x1<<ch); // Clear the GPIO pin - } else { - onCount[ch] = on[ch]; - offCount[ch]= off[ch]; - } - } - } -} diff --git a/books/pru-cookbook/05blocks/code/pwm4.pru0.c b/books/pru-cookbook/05blocks/code/pwm4.pru0.c deleted file mode 100644 index ee0f7ec6..00000000 --- a/books/pru-cookbook/05blocks/code/pwm4.pru0.c +++ /dev/null @@ -1,50 +0,0 @@ -// This code does MAXCH parallel PWM channels. -// It's period is 3 us -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" - -#define PRU0_DRAM 0x00000 // Offset to DRAM -// Skip the first 0x200 byte of DRAM since the Makefile allocates -// 0x100 for the STACK and 0x100 for the HEAP. -volatile unsigned int *pru0_dram = (unsigned int *) (PRU0_DRAM + 0x200); - -#define MAXCH 4 // Maximum number of channels per PRU - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - uint32_t ch; - uint32_t on[] = {1, 2, 3, 4}; // Number of cycles to stay on - uint32_t off[] = {4, 3, 2, 1}; // Number to stay off - uint32_t onCount[MAXCH]; // Current count - uint32_t offCount[MAXCH]; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - // Initialize the channel counters. - for(ch=0; ch<MAXCH; ch++) { - pru0_dram[2*ch ] = on[ch]; // Copy to DRAM0 so the ARM can change it - pru0_dram[2*ch+1] = off[ch]; // Interleave the on and off values - onCount[ch] = on[ch]; - offCount[ch]= off[ch]; - } - - while (1) { - for(ch=0; ch<MAXCH; ch++) { - if(onCount[ch]) { - onCount[ch]--; - __R30 |= 0x1<<ch; // Set the GPIO pin to 1 - } else if(offCount[ch]) { - offCount[ch]--; - __R30 &= ~(0x1<<ch); // Clear the GPIO pin - } else { - onCount[ch] = pru0_dram[2*ch]; // Read from DRAM0 - offCount[ch]= pru0_dram[2*ch+1]; - } - } - } -} diff --git a/books/pru-cookbook/05blocks/code/pwm5.pru0.c b/books/pru-cookbook/05blocks/code/pwm5.pru0.c deleted file mode 100644 index 60a97b81..00000000 --- a/books/pru-cookbook/05blocks/code/pwm5.pru0.c +++ /dev/null @@ -1,53 +0,0 @@ -// This code does MAXCH parallel PWM channels. -// It's period is 510ns. -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" - -#define PRU0_DRAM 0x00000 // Offset to DRAM -// Skip the first 0x200 byte of DRAM since the Makefile allocates -// 0x100 for the STACK and 0x100 for the HEAP. -volatile unsigned int *pru0_dram = (unsigned int *) (PRU0_DRAM + 0x200); - -#define MAXCH 4 // Maximum number of channels per PRU - -#define update(ch) \ - if(onCount[ch]) { \ - onCount[ch]--; \ - __R30 |= 0x1<<ch; \ - } else if(offCount[ch]) { \ - offCount[ch]--; \ - __R30 &= ~(0x1<<ch); \ - } else { \ - onCount[ch] = pru0_dram[2*ch]; \ - offCount[ch]= pru0_dram[2*ch+1]; \ - } - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - uint32_t ch; - uint32_t on[] = {1, 2, 3, 4}; - uint32_t off[] = {4, 3, 2, 1}; - uint32_t onCount[MAXCH], offCount[MAXCH]; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - -#pragma UNROLL(MAXCH) - for(ch=0; ch<MAXCH; ch++) { - pru0_dram[2*ch ] = on[ch]; // Copy to DRAM0 so the ARM can change it - pru0_dram[2*ch+1] = off[ch]; // Interleave the on and off values - onCount[ch] = on[ch]; - offCount[ch]= off[ch]; - } - - while (1) { - update(0) - update(1) - update(2) - update(3) - } -} diff --git a/books/pru-cookbook/05blocks/code/pwm6.pru0.c b/books/pru-cookbook/05blocks/code/pwm6.pru0.c deleted file mode 100644 index 6df321f5..00000000 --- a/books/pru-cookbook/05blocks/code/pwm6.pru0.c +++ /dev/null @@ -1,56 +0,0 @@ -// This code does MAXCH parallel PWM channels. -// All channels start at the same time. It's period is 510ns -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" - -#define PRU0_DRAM 0x00000 // Offset to DRAM -// Skip the first 0x200 byte of DRAM since the Makefile allocates -// 0x100 for the STACK and 0x100 for the HEAP. -volatile unsigned int *pru0_dram = (unsigned int *) (PRU0_DRAM + 0x200); - -#define MAXCH 4 // Maximum number of channels per PRU - -#define update(ch) \ - if(onCount[ch]) { \ - onCount[ch]--; \ - Rtmp |= 0x1<<ch; \ - } else if(offCount[ch]) { \ - offCount[ch]--; \ - Rtmp &= ~(0x1<<ch); \ - } else { \ - onCount[ch] = pru0_dram[2*ch]; \ - offCount[ch]= pru0_dram[2*ch+1]; \ - } - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - uint32_t ch; - uint32_t on[] = {1, 2, 3, 4}; - uint32_t off[] = {4, 3, 2, 1}; - uint32_t onCount[MAXCH], offCount[MAXCH]; - register uint32_t Rtmp; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - -#pragma UNROLL(MAXCH) - for(ch=0; ch<MAXCH; ch++) { - pru0_dram[2*ch ] = on[ch]; // Copy to DRAM0 so the ARM can change it - pru0_dram[2*ch+1] = off[ch]; // Interleave the on and off values - onCount[ch] = on[ch]; - offCount[ch]= off[ch]; - } - Rtmp = __R30; - - while (1) { - update(0) - update(1) - update(2) - update(3) - __R30 = Rtmp; - } -} diff --git a/books/pru-cookbook/05blocks/code/pwm7-test.c b/books/pru-cookbook/05blocks/code/pwm7-test.c deleted file mode 100644 index cbb67698..00000000 --- a/books/pru-cookbook/05blocks/code/pwm7-test.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - * - * pwm tester - * (c) Copyright 2016 - * Mark A. Yoder, 20-July-2016 - * The channels 0-11 are on PRU1 and channels 12-17 are on PRU0 - * The period and duty cycle values are stored in each PRU's Data memory - * The enable bits are stored in the shared memory - * - */ - -#include <stdio.h> -#include <fcntl.h> -#include <sys/mman.h> - -#define MAXCH 2 - -#define PRU_ADDR 0x4A300000 // Start of PRU memory Page 184 am335x TRM -#define PRU_LEN 0x80000 // Length of PRU memory -#define PRU0_DRAM 0x00000 // Offset to DRAM -#define PRU1_DRAM 0x02000 -#define PRU_SHAREDMEM 0x10000 // Offset to shared memory - -unsigned int *pru0DRAM_32int_ptr; // Points to the start of local DRAM -unsigned int *pru1DRAM_32int_ptr; // Points to the start of local DRAM -unsigned int *prusharedMem_32int_ptr; // Points to the start of the shared memory - -/******************************************************************************* -* int start_pwm_count(int ch, int countOn, int countOff) -* -* Starts a pwm pulse on for countOn and off for countOff to a single channel (ch) -*******************************************************************************/ -int start_pwm_count(int ch, int countOn, int countOff, unsigned int *ptr) { - unsigned int *pruDRAM_32int_ptr = ptr; - - printf("countOn: %d, countOff: %d, count: %d\n", - countOn, countOff, countOn+countOff); - // write to PRU shared memory - pruDRAM_32int_ptr[2*(ch)+0] = countOn; // On time - pruDRAM_32int_ptr[2*(ch)+1] = countOff; // Off time - return 0; -} - -int main(int argc, char *argv[]) -{ - unsigned int *pru; // Points to start of PRU memory. - int fd; - printf("Servo tester\n"); - - fd = open ("/dev/mem", O_RDWR | O_SYNC); - if (fd == -1) { - printf ("ERROR: could not open /dev/mem.\n\n"); - return 1; - } - pru = mmap (0, PRU_LEN, PROT_READ | PROT_WRITE, MAP_SHARED, fd, PRU_ADDR); - if (pru == MAP_FAILED) { - printf ("ERROR: could not map memory.\n\n"); - return 1; - } - close(fd); - printf ("Using /dev/mem.\n"); - - pru0DRAM_32int_ptr = pru + PRU0_DRAM/4 + 0x200/4; // Points to 0x200 of PRU0 memory - pru1DRAM_32int_ptr = pru + PRU1_DRAM/4 + 0x200/4; // Points to 0x200 of PRU1 memory - prusharedMem_32int_ptr = pru + PRU_SHAREDMEM/4; // Points to start of shared memory - - - int on[] = {1, 2, 3, 4}; - int off[] = {4, 3, 2, 1}; - - int ch; - for(ch=0; ch<MAXCH; ch++) { - start_pwm_count(ch, on[ch], off[ch], pru0DRAM_32int_ptr); - start_pwm_count(ch, on[ch+MAXCH], off[ch+MAXCH], pru1DRAM_32int_ptr); - } - - if(munmap(pru, PRU_LEN)) { - printf("munmap failed\n"); - } else { - printf("munmap succeeded\n"); - } -} - diff --git a/books/pru-cookbook/05blocks/code/pwm7.pru0.c b/books/pru-cookbook/05blocks/code/pwm7.pru0.c deleted file mode 100644 index b95c5caa..00000000 --- a/books/pru-cookbook/05blocks/code/pwm7.pru0.c +++ /dev/null @@ -1,57 +0,0 @@ -// This code does MAXCH parallel PWM channels on both PRU 0 and PRU 1 -// All channels start at the same time. But the PRU 1 ch have a difference period -// It's period is 370ns -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" - -#define PRUNUM 0 - -#define PRU0_DRAM 0x00000 // Offset to DRAM -// Skip the first 0x200 byte of DRAM since the Makefile allocates -// 0x100 for the STACK and 0x100 for the HEAP. -volatile unsigned int *pru0_dram = (unsigned int *) (PRU0_DRAM + 0x200); - -#define MAXCH 2 // Maximum number of channels per PRU - -#define update(ch) \ - if(onCount[ch]) { \ - onCount[ch]--; \ - Rtmp |= 0x1<<ch; \ - } else if(offCount[ch]) { \ - offCount[ch]--; \ - Rtmp &= ~(0x1<<ch); \ - } else { \ - onCount[ch] = pru0_dram[2*ch]; \ - offCount[ch]= pru0_dram[2*ch+1]; \ - } - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - uint32_t ch; - uint32_t on[] = {1, 2, 3, 4}; - uint32_t off[] = {4, 3, 2, 1}; - uint32_t onCount[MAXCH], offCount[MAXCH]; - register uint32_t Rtmp; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - -#pragma UNROLL(MAXCH) - for(ch=0; ch<MAXCH; ch++) { - pru0_dram[2*ch ] = on [ch+PRUNUM*MAXCH]; // Copy to DRAM0 so the ARM can change it - pru0_dram[2*ch+1] = off[ch+PRUNUM*MAXCH]; // Interleave the on and off values - onCount[ch] = on [ch+PRUNUM*MAXCH]; - offCount[ch]= off[ch+PRUNUM*MAXCH]; - } - Rtmp = __R30; - - while (1) { - update(0) - update(1) - __R30 = Rtmp; - } -} diff --git a/books/pru-cookbook/05blocks/code/pwm7.pru1.c b/books/pru-cookbook/05blocks/code/pwm7.pru1.c deleted file mode 100644 index 50d4788b..00000000 --- a/books/pru-cookbook/05blocks/code/pwm7.pru1.c +++ /dev/null @@ -1,57 +0,0 @@ -// This code does MAXCH parallel PWM channels on both PRU 0 and PRU 1 -// All channels start at the same time. But the PRU 1 ch have a difference period -// It's period is 370ns -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" - -#define PRUNUM 1 - -#define PRU0_DRAM 0x00000 // Offset to DRAM -// Skip the first 0x200 byte of DRAM since the Makefile allocates -// 0x100 for the STACK and 0x100 for the HEAP. -volatile unsigned int *pru0_dram = (unsigned int *) (PRU0_DRAM + 0x200); - -#define MAXCH 2 // Maximum number of channels per PRU - -#define update(ch) \ - if(onCount[ch]) { \ - onCount[ch]--; \ - Rtmp |= 0x1<<ch; \ - } else if(offCount[ch]) { \ - offCount[ch]--; \ - Rtmp &= ~(0x1<<ch); \ - } else { \ - onCount[ch] = pru0_dram[2*ch]; \ - offCount[ch]= pru0_dram[2*ch+1]; \ - } - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - uint32_t ch; - uint32_t on[] = {1, 2, 3, 4}; - uint32_t off[] = {4, 3, 2, 1}; - uint32_t onCount[MAXCH], offCount[MAXCH]; - register uint32_t Rtmp; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - -#pragma UNROLL(MAXCH) - for(ch=0; ch<MAXCH; ch++) { - pru0_dram[2*ch ] = on [ch+PRUNUM*MAXCH]; // Copy to DRAM0 so the ARM can change it - pru0_dram[2*ch+1] = off[ch+PRUNUM*MAXCH]; // Interleave the on and off values - onCount[ch] = on [ch+PRUNUM*MAXCH]; - offCount[ch]= off[ch+PRUNUM*MAXCH]; - } - Rtmp = __R30; - - while (1) { - update(0) - update(1) - __R30 = Rtmp; - } -} diff --git a/books/pru-cookbook/05blocks/code/pwm7_setup.sh b/books/pru-cookbook/05blocks/code/pwm7_setup.sh deleted file mode 100755 index aae4c778..00000000 --- a/books/pru-cookbook/05blocks/code/pwm7_setup.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -# -export TARGET=pwm7.pru0 -echo TARGET=$TARGET - -# Configure the PRU pins based on which Beagle is running -machine=$(awk '{print $NF}' /proc/device-tree/model) -echo -n $machine -if [ $machine = "Black" ]; then - echo " Found" - pins="P9_31 P9_29 P8_45 P8_46" -elif [ $machine = "Blue" ]; then - echo " Found" - pins="" -elif [ $machine = "PocketBeagle" ]; then - echo " Found" - pins="P1_36 P1_33" -else - echo " Not Found" - pins="" -fi - -for pin in $pins -do - echo $pin - config-pin $pin pruout - config-pin -q $pin -done diff --git a/books/pru-cookbook/05blocks/code/pwm8.pru0.c b/books/pru-cookbook/05blocks/code/pwm8.pru0.c deleted file mode 100644 index 25499c3c..00000000 --- a/books/pru-cookbook/05blocks/code/pwm8.pru0.c +++ /dev/null @@ -1,78 +0,0 @@ -// This code does MAXCH parallel PWM channels on both PRU 0 and PRU 1 -// All channels start at the same time. -// It's period is 430ns -#include <stdint.h> -#include <pru_cfg.h> -#include <pru_intc.h> -#include <pru_ctrl.h> -#include "resource_table_empty.h" - -#define PRUNUM 0 - -#define PRU0_DRAM 0x00000 // Offset to DRAM -// Skip the first 0x200 byte of DRAM since the Makefile allocates -// 0x100 for the STACK and 0x100 for the HEAP. -volatile unsigned int *pru0_dram = (unsigned int *) (PRU0_DRAM + 0x200); - -#define MAXCH 2 // Maximum number of channels per PRU - -#define update(ch) \ - if(onCount[ch]) { \ - onCount[ch]--; \ - Rtmp |= 0x1<<ch; \ - } else if(offCount[ch]) { \ - offCount[ch]--; \ - Rtmp &= ~(0x1<<ch); \ - } else { \ - onCount[ch] = pru0_dram[2*ch]; \ - offCount[ch]= pru0_dram[2*ch+1]; \ - } - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -// Initialize interrupts so the PRUs can be synchronized. -// PRU1 is started first and then waits for PRU0 -// PRU0 is then started and tells PRU1 when to start going -void configIntc(void) { - __R31 = 0x00000000; // Clear any pending PRU-generated events - CT_INTC.CMR4_bit.CH_MAP_16 = 1; // Map event 16 to channel 1 - CT_INTC.HMR0_bit.HINT_MAP_1 = 1; // Map channel 1 to host 1 - CT_INTC.SICR = 16; // Ensure event 16 is cleared - CT_INTC.EISR = 16; // Enable event 16 - CT_INTC.HIEISR |= (1 << 0); // Enable Host interrupt 1 - CT_INTC.GER = 1; // Globally enable host interrupts -} - -void main(void) -{ - uint32_t ch; - uint32_t on[] = {1, 2, 3, 4}; - uint32_t off[] = {4, 3, 2, 1}; - uint32_t onCount[MAXCH], offCount[MAXCH]; - register uint32_t Rtmp; - - CT_CFG.GPCFG0 = 0x0000; // Configure GPI and GPO as Mode 0 (Direct Connect) - configIntc(); // Configure INTC - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - -#pragma UNROLL(MAXCH) - for(ch=0; ch<MAXCH; ch++) { - pru0_dram[2*ch ] = on [ch+PRUNUM*MAXCH]; // Copy to DRAM0 so the ARM can change it - pru0_dram[2*ch+1] = off[ch+PRUNUM*MAXCH]; // Interleave the on and off values - onCount[ch] = on [ch+PRUNUM*MAXCH]; - offCount[ch]= off[ch+PRUNUM*MAXCH]; - } - Rtmp = __R30; - - while (1) { - __R30 = Rtmp; - update(0) - update(1) -#define PRU0_PRU1_EVT 16 - __R31 = (PRU0_PRU1_EVT-16) | (0x1<<5); //Tell PRU 1 to start - __delay_cycles(1); - } -} diff --git a/books/pru-cookbook/05blocks/code/pwm8.pru1.c b/books/pru-cookbook/05blocks/code/pwm8.pru1.c deleted file mode 100644 index 7d4da138..00000000 --- a/books/pru-cookbook/05blocks/code/pwm8.pru1.c +++ /dev/null @@ -1,66 +0,0 @@ -// This code does MAXCH parallel PWM channels on both PRU 0 and PRU 1 -// All channels start at the same time. -// It's period is 430ns -#include <stdint.h> -#include <pru_cfg.h> -#include <pru_intc.h> -#include <pru_ctrl.h> -#include "resource_table_empty.h" - -#define PRUNUM 1 - -#define PRU0_DRAM 0x00000 // Offset to DRAM -// Skip the first 0x200 byte of DRAM since the Makefile allocates -// 0x100 for the STACK and 0x100 for the HEAP. -volatile unsigned int *pru0_dram = (unsigned int *) (PRU0_DRAM + 0x200); - -#define MAXCH 2 // Maximum number of channels per PRU - -#define update(ch) \ - if(onCount[ch]) { \ - onCount[ch]--; \ - Rtmp |= 0x1<<ch; \ - } else if(offCount[ch]) { \ - offCount[ch]--; \ - Rtmp &= ~(0x1<<ch); \ - } else { \ - onCount[ch] = pru0_dram[2*ch]; \ - offCount[ch]= pru0_dram[2*ch+1]; \ - } - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -// Initialize interrupts so the PRUs can be synchronized. -// PRU1 is started first and then waits for PRU0 -// PRU0 is then started and tells PRU1 when to start going - -void main(void) -{ - uint32_t ch; - uint32_t on[] = {1, 2, 3, 4}; - uint32_t off[] = {4, 3, 2, 1}; - uint32_t onCount[MAXCH], offCount[MAXCH]; - register uint32_t Rtmp; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - -#pragma UNROLL(MAXCH) - for(ch=0; ch<MAXCH; ch++) { - pru0_dram[2*ch ] = on [ch+PRUNUM*MAXCH]; // Copy to DRAM0 so the ARM can change it - pru0_dram[2*ch+1] = off[ch+PRUNUM*MAXCH]; // Interleave the on and off values - onCount[ch] = on [ch+PRUNUM*MAXCH]; - offCount[ch]= off[ch+PRUNUM*MAXCH]; - } - Rtmp = __R30; - - while (1) { - while((__R31 & (0x1<<31))==0) { // Wait for PRU 0 - } - CT_INTC.SICR = 16; // Clear event 16 - __R30 = Rtmp; - update(0) - update(1) - } -} diff --git a/books/pru-cookbook/05blocks/code/pwm_setup.sh b/books/pru-cookbook/05blocks/code/pwm_setup.sh deleted file mode 100755 index b69ed129..00000000 --- a/books/pru-cookbook/05blocks/code/pwm_setup.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -# -export TARGET=pwm1.pru0 -echo TARGET=$TARGET - -# Configure the PRU pins based on which Beagle is running -machine=$(awk '{print $NF}' /proc/device-tree/model) -echo -n $machine -if [ $machine = "Black" ]; then - echo " Found" - pins="P9_31 P9_29 P9_30 P9_28" -elif [ $machine = "Blue" ]; then - echo " Found" - pins="" -elif [ $machine = "PocketBeagle" ]; then - echo " Found" - pins="P1_36 P1_33 P2_32 P2_30" -else - echo " Not Found" - pins="" -fi - -for pin in $pins -do - echo $pin - config-pin $pin pruout - config-pin -q $pin -done diff --git a/books/pru-cookbook/05blocks/code/resource_table_empty.h b/books/pru-cookbook/05blocks/code/resource_table_empty.h deleted file mode 100644 index 07e97d9b..00000000 --- a/books/pru-cookbook/05blocks/code/resource_table_empty.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * ======== resource_table_empty.h ======== - * - * Define the resource table entries for all PRU cores. This will be - * incorporated into corresponding base images, and used by the remoteproc - * on the host-side to allocated/reserve resources. Note the remoteproc - * driver requires that all PRU firmware be built with a resource table. - * - * This file contains an empty resource table. It can be used either as: - * - * 1) A template, or - * 2) As-is if a PRU application does not need to configure PRU_INTC - * or interact with the rpmsg driver - * - */ - -#ifndef _RSC_TABLE_PRU_H_ -#define _RSC_TABLE_PRU_H_ - -#include <stddef.h> -#include <rsc_types.h> - -struct my_resource_table { - struct resource_table base; - - uint32_t offset[1]; /* Should match 'num' in actual definition */ -}; - -#pragma DATA_SECTION(pru_remoteproc_ResourceTable, ".resource_table") -#pragma RETAIN(pru_remoteproc_ResourceTable) -struct my_resource_table pru_remoteproc_ResourceTable = { - 1, /* we're the first version that implements this */ - 0, /* number of entries in the table */ - 0, 0, /* reserved, must be zero */ - 0, /* offset[0] */ -}; - -#endif /* _RSC_TABLE_PRU_H_ */ - diff --git a/books/pru-cookbook/05blocks/code/rgb1.pru0.c b/books/pru-cookbook/05blocks/code/rgb1.pru0.c deleted file mode 100644 index 9936d627..00000000 --- a/books/pru-cookbook/05blocks/code/rgb1.pru0.c +++ /dev/null @@ -1,80 +0,0 @@ -// This code drives the RGB LED Matrix on the 1st Connector -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" -#include "rgb_pocket.h" - -#define DELAY 10 // Number of cycles (5ns each) to wait after a write - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - // Set up the pointers to each of the GPIO ports - uint32_t *gpio[] = { - (uint32_t *) GPIO0, - (uint32_t *) GPIO1, - (uint32_t *) GPIO2, - (uint32_t *) GPIO3 - }; - - uint32_t i, row; - - while(1) { - for(row=0; row<16; row++) { - // Set the row address - // Here we take advantage of the select bits (LA,LB,LC,LD) - // being sequential in the R30 register (bits 2,3,4,5) - // We shift row over so it lines up with the select bits - // Oring (|=) with R30 sets bits to 1 and - // Anding (&=) clears bits to 0, the 0xffc mask makes sure the - // other bits aren't changed. - __R30 |= row<<pru_sel0; - __R30 &= (row<<pru_sel0)|0xffc3; - - for(i=0; i<64; i++) { - // Top row white - // Combining these to one write works because they are all in - // the same gpio port - gpio[r11_gpio][GPIO_SETDATAOUT] = r11_pin | g11_pin | b11_pin; - __delay_cycles(DELAY);; - - // Bottom row red - gpio[r12_gpio][GPIO_SETDATAOUT] = r12_pin; - __delay_cycles(DELAY); - gpio[r12_gpio][GPIO_CLEARDATAOUT] = g12_pin | b12_pin; - __delay_cycles(DELAY); - - __R30 |= pru_clock; // Toggle clock - __delay_cycles(DELAY); - __R30 &= ~pru_clock; - __delay_cycles(DELAY); - - // Top row black - gpio[r11_gpio][GPIO_CLEARDATAOUT] = r11_pin | g11_pin | b11_pin; - __delay_cycles(DELAY); - - // Bottom row green - gpio[r12_gpio][GPIO_CLEARDATAOUT] = r12_pin | b12_pin; - __delay_cycles(DELAY); - gpio[r12_gpio][GPIO_SETDATAOUT] = g12_pin; - __delay_cycles(DELAY); - - __R30 |= pru_clock; // Toggle clock - __delay_cycles(DELAY); - __R30 &= ~pru_clock; - __delay_cycles(DELAY); - } - __R30 |= pru_oe; // Disable display - __delay_cycles(DELAY); - __R30 |= pru_latch; // Toggle latch - __delay_cycles(DELAY); - __R30 &= ~pru_latch; - __delay_cycles(DELAY); - __R30 &= ~pru_oe; // Enable display - __delay_cycles(DELAY); - } - } -} diff --git a/books/pru-cookbook/05blocks/code/rgb2.pru0.c b/books/pru-cookbook/05blocks/code/rgb2.pru0.c deleted file mode 100644 index eb43b357..00000000 --- a/books/pru-cookbook/05blocks/code/rgb2.pru0.c +++ /dev/null @@ -1,81 +0,0 @@ -// This code drives the RGB LED Matrix on J1 connector -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" -#include "rgb_pocket.h" - -#define DELAY 100 - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - // Set up the pointers to each of the GPIO ports - uint32_t *gpio[] = { - (uint32_t *) GPIO0, - (uint32_t *) GPIO1, - (uint32_t *) GPIO2, - (uint32_t *) GPIO3 - }; - - uint32_t i, row; - - while(1) { - for(row=0; row<16; row++) { - if(row&(0x1<<0)) __R30|=(0x1<<pru_sel0); else __R30&=~(0x1<<pru_sel0); - __delay_cycles(DELAY); - if(row&(0x1<<1)) __R30|=(0x1<<pru_sel1); else __R30&=~(0x1<<pru_sel1); - __delay_cycles(DELAY); - if(row&(0x1<<2)) __R30|=(0x1<<pru_sel2); else __R30&=~(0x1<<pru_sel2); - __delay_cycles(DELAY); - if(row&(0x1<<3)) __R30|=(0x1<<pru_sel3); else __R30&=~(0x1<<pru_sel3); - __delay_cycles(DELAY); - - for(i=0; i<64; i++) { - // red - gpio[r11_gpio][GPIO_SETDATAOUT] = r11_pin; - __delay_cycles(DELAY); - gpio[r11_gpio][GPIO_CLEARDATAOUT] = g11_pin | b11_pin; - __delay_cycles(DELAY); - - // green - gpio[r11_gpio][GPIO_CLEARDATAOUT] = r12_pin | b12_pin; - __delay_cycles(DELAY); - gpio[r11_gpio][GPIO_SETDATAOUT] = g12_pin; - __delay_cycles(DELAY); - - __R30 |= pru_clock; // Toggle clock - __delay_cycles(DELAY); - __R30 &= ~pru_clock; - __delay_cycles(DELAY); - - // blue - gpio[r11_gpio][GPIO_CLEARDATAOUT] = r11_pin | g11_pin; - __delay_cycles(DELAY); - gpio[r11_gpio][GPIO_SETDATAOUT] = b11_pin; - __delay_cycles(DELAY); - - //blue - gpio[r11_gpio][GPIO_CLEARDATAOUT] = r12_pin | g12_pin; - __delay_cycles(DELAY); - gpio[r11_gpio][GPIO_SETDATAOUT] = b12_pin; - __delay_cycles(DELAY); - - __R30 |= pru_clock; // Toggle clock - __delay_cycles(DELAY); - __R30 &= ~pru_clock; - __delay_cycles(DELAY); - } - __R30 |= pru_oe; // Disable display - __delay_cycles(DELAY); - __R30 |= pru_latch; // Toggle latch - __delay_cycles(DELAY); - __R30 &= ~pru_latch; - __delay_cycles(DELAY); - __R30 &= ~pru_oe; // Enable display - __delay_cycles(DELAY); - } - } -} diff --git a/books/pru-cookbook/05blocks/code/rgb3.pru0.c b/books/pru-cookbook/05blocks/code/rgb3.pru0.c deleted file mode 100644 index b14ad864..00000000 --- a/books/pru-cookbook/05blocks/code/rgb3.pru0.c +++ /dev/null @@ -1,114 +0,0 @@ -// This code drives the RGB LED Matrix on the 1st and 2nd Connectors -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" -#include "rgb_pocket.h" - -#define DELAY 10 // Number of cycles (5ns each) to wait after a write - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - // Set up the pointers to each of the GPIO ports - uint32_t *gpio[] = { - (uint32_t *) GPIO0, - (uint32_t *) GPIO1, - (uint32_t *) GPIO2, - (uint32_t *) GPIO3 - }; - - uint32_t i, row; - - while(1) { - for(row=0; row<16; row++) { - // Set the row address - // Here we take advantage of the select bits (LA,LB,LC,LD) - // being sequential in the R30 register (bits 2,3,4,5) - // We shift row over so it lines up with the select bits - // Oring (|=) with R30 sets bits to 1 and - // Anding (&=) clears bits to 0, the 0xffc mask makes sure the - // other bits aren't changed. - __R30 |= row<<pru_sel0; - __R30 &= (row<<pru_sel0)|0xffc3; - - for(i=0; i<64; i++) { - // Panel 1 Upper - // Top row white - // Combining these to one write works because they are all in - // the same gpio port - gpio[r11_gpio][GPIO_SETDATAOUT] = r11_pin | g11_pin | b11_pin; - __delay_cycles(DELAY); - - // Bottom row red - gpio[r12_gpio][GPIO_SETDATAOUT] = r12_pin; - // __delay_cycles(DELAY); - gpio[g12_gpio][GPIO_CLEARDATAOUT] = g12_pin | b12_pin; - __delay_cycles(DELAY); - - // Panel 2 Upper - // Top row blue - // Combining these to one write works because they are all in - // the same gpio port except b12 - gpio[r21_gpio][GPIO_CLEARDATAOUT] = r21_pin | g21_pin; - // __delay_cycles(DELAY); - gpio[b21_gpio][GPIO_SETDATAOUT] = b21_pin; - __delay_cycles(DELAY); - - // Bottom row red - gpio[r22_gpio][GPIO_SETDATAOUT] = r22_pin; - __delay_cycles(DELAY); - gpio[g22_gpio][GPIO_CLEARDATAOUT] = g22_pin; - __delay_cycles(DELAY); - gpio[b22_gpio][GPIO_CLEARDATAOUT] = b22_pin; - __delay_cycles(DELAY); - - __R30 |= pru_clock; // Toggle clock - __delay_cycles(DELAY); - __R30 &= ~pru_clock; - __delay_cycles(DELAY); - - // Panel 1 Lower - // Top row black - gpio[r11_gpio][GPIO_CLEARDATAOUT] = r11_pin | g11_pin | b11_pin; - __delay_cycles(DELAY); - - // Bottom row green - gpio[r12_gpio][GPIO_CLEARDATAOUT] = r12_pin | b12_pin; - __delay_cycles(DELAY); - gpio[g12_gpio][GPIO_SETDATAOUT] = g12_pin; - __delay_cycles(DELAY); - - // Panel 2 Lower - // Top row reg+green = yellow - gpio[r21_gpio][GPIO_SETDATAOUT] = r21_pin | g21_pin; - __delay_cycles(DELAY); - gpio[b21_gpio][GPIO_CLEARDATAOUT] = b21_pin; - __delay_cycles(DELAY); - - // Bottom row green - gpio[r22_gpio][GPIO_CLEARDATAOUT] = r22_pin; - __delay_cycles(DELAY); - gpio[b22_gpio][GPIO_CLEARDATAOUT] = b22_pin; - __delay_cycles(DELAY); - gpio[g22_gpio][GPIO_SETDATAOUT] = g22_pin; - __delay_cycles(2*DELAY); - - __R30 |= pru_clock; // Toggle clock - __delay_cycles(DELAY); - __R30 &= ~pru_clock; - __delay_cycles(DELAY); - } - __R30 |= pru_oe; // Disable display - __delay_cycles(DELAY); - __R30 |= pru_latch; // Toggle latch - __delay_cycles(DELAY); - __R30 &= ~pru_latch; - __delay_cycles(DELAY); - __R30 &= ~pru_oe; // Enable display - __delay_cycles(DELAY); - } - } -} diff --git a/books/pru-cookbook/05blocks/code/rgb4.pru0.c b/books/pru-cookbook/05blocks/code/rgb4.pru0.c deleted file mode 100644 index 6d06f121..00000000 --- a/books/pru-cookbook/05blocks/code/rgb4.pru0.c +++ /dev/null @@ -1,84 +0,0 @@ -// This code drives the RGB LED Matrix on the 2nd Connector -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" -#include "rgb_pocket.h" - -#define DELAY 10 // Number of cycles (5ns each) to wait after a write - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - // Set up the pointers to each of the GPIO ports - uint32_t *gpio[] = { - (uint32_t *) GPIO0, - (uint32_t *) GPIO1, - (uint32_t *) GPIO2, - (uint32_t *) GPIO3 - }; - - uint32_t i, row; - - while(1) { - for(row=0; row<16; row++) { - // Set the row address - // Here we take advantage of the select bits (LA,LB,LC,LD) - // being sequential in the R30 register (bits 2,3,4,5) - // We shift row over so it lines up with the select bits - // Oring (|=) with R30 sets bits to 1 and - // Anding (&=) clears bits to 0, the 0xffc mask makes sure the - // other bits aren't changed. - __R30 |= row<<pru_sel0; - __R30 &= (row<<pru_sel0)|0xffc3; - - for(i=0; i<64; i++) { - // Top row white - // Combining these to one write works because they are all in - // the same gpio port except b12 - gpio[r21_gpio][GPIO_SETDATAOUT] = r21_pin | g21_pin; - __delay_cycles(DELAY); - gpio[b21_gpio][GPIO_SETDATAOUT] = b21_pin; - __delay_cycles(DELAY); - - // Bottom row red - gpio[r22_gpio][GPIO_SETDATAOUT] = r22_pin; - __delay_cycles(DELAY); - gpio[g22_gpio][GPIO_CLEARDATAOUT] = g22_pin | b22_pin; - __delay_cycles(2*DELAY); - - __R30 |= pru_clock; // Toggle clock - __delay_cycles(DELAY); - __R30 &= ~pru_clock; - __delay_cycles(DELAY); - - // Top row black - gpio[r21_gpio][GPIO_CLEARDATAOUT] = r21_pin | g21_pin; - __delay_cycles(DELAY); - gpio[b21_gpio][GPIO_CLEARDATAOUT] = b21_pin; - __delay_cycles(DELAY); - - // Bottom row green - gpio[r22_gpio][GPIO_CLEARDATAOUT] = r22_pin | b22_pin; - __delay_cycles(DELAY); - gpio[g22_gpio][GPIO_SETDATAOUT] = g22_pin; - __delay_cycles(2*DELAY); - - __R30 |= pru_clock; // Toggle clock - __delay_cycles(DELAY); - __R30 &= ~pru_clock; - __delay_cycles(DELAY); - } - __R30 |= pru_oe; // Disable display - __delay_cycles(DELAY); - __R30 |= pru_latch; // Toggle latch - __delay_cycles(DELAY); - __R30 &= ~pru_latch; - __delay_cycles(DELAY); - __R30 &= ~pru_oe; // Enable display - __delay_cycles(DELAY); - } - } -} diff --git a/books/pru-cookbook/05blocks/code/rgb_black.h b/books/pru-cookbook/05blocks/code/rgb_black.h deleted file mode 100644 index be7cf4ba..00000000 --- a/books/pru-cookbook/05blocks/code/rgb_black.h +++ /dev/null @@ -1,31 +0,0 @@ -//Black - Not tested -// These are from https://github.com/FalconChristmas/fpp/blob/master/src/pru/PocketScrollerV1.hp -// _gpio tells which gpio port and _pin tells which bit in the port -// The first 1 in r11 is for the J1 connector -// See the githuub file for the other connectors - -#define r11_gpio 2 -#define r11_pin 9 -#define g11_gpio 2 -#define g11_pin 11 -#define b11_gpio 2 -#define b11_pin 10 - -#define r12_gpio 2 -#define r12_pin 12 -#define g12_gpio 2 -#define g12_pin 22 -#define b12_gpio 2 -#define b12_pin 23 - -#define pru_latch 1 // These are the bit positions in R30 -#define pru_oe 0 -#define pru_clock 2 - -// Control pins are all in GPIO2 -// The pocket has these on R0, the code needs to be changed for this work work -#define gpio_sel0 13 /* must be sequential with sel1 and sel2 */ -#define gpio_sel1 14 -#define gpio_sel2 15 -#define gpio_sel3 16 -#define gpio_sel4 17 diff --git a/books/pru-cookbook/05blocks/code/rgb_pocket.h b/books/pru-cookbook/05blocks/code/rgb_pocket.h deleted file mode 100644 index 45a91118..00000000 --- a/books/pru-cookbook/05blocks/code/rgb_pocket.h +++ /dev/null @@ -1,45 +0,0 @@ -// Pocket -// These are from https://github.com/FalconChristmas/fpp/blob/master/src/pru/PocketScrollerV1.hp -// _gpio tells which gpio port and _pin tells which bit in the port -// The first 1 in r11 is for the J1 connector -// See the githuub file for the other connectors - -// J1 -#define r11_gpio 1 -#define r11_pin (0x1<<20) -#define g11_gpio 1 -#define g11_pin (0x1<<28) -#define b11_gpio 1 -#define b11_pin (0x1<<25) - -#define r12_gpio 1 -#define r12_pin (0x1<<26) -#define g12_gpio 1 -#define g12_pin (0x1<<27) -#define b12_gpio 1 -#define b12_pin (0x1<<18) - -// J2 -#define r21_gpio 1 -#define r21_pin (0x1<<8) -#define g21_gpio 1 -#define g21_pin (0x1<<9) -#define b21_gpio 0 -#define b21_pin (0x1<<30) - -#define r22_gpio 1 -#define r22_pin (0x1<<12) -#define g22_gpio 1 -#define g22_pin (0x1<<14) -#define b22_gpio 1 -#define b22_pin (0x1<<15) - -// All connectors -#define pru_latch (0x1<<0) // These are the bit positions in R30 -#define pru_oe (0x1<<7) -#define pru_clock (0x1<<1) - -#define pru_sel0 2 // These are called LA, LB, LC and LD in the python code -#define pru_sel1 3 // Also bit positions -#define pru_sel2 4 -#define pru_sel3 5 diff --git a/books/pru-cookbook/05blocks/code/rgb_python.py b/books/pru-cookbook/05blocks/code/rgb_python.py deleted file mode 100755 index 25e35334..00000000 --- a/books/pru-cookbook/05blocks/code/rgb_python.py +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env python3 -import Adafruit_BBIO.GPIO as GPIO - -# Define which functions are connect to which pins -OE="P1_29" # Output Enable, active low -LAT="P1_36" # Latch, toggle after clocking in a row of pixels -CLK="P1_33" # Clock, toggle after each pixel - -# Input data pins -R1="P2_10" # R1, G1, B1 are for the top rows (1-16) of pixels -G1="P2_8" -B1="P2_6" - -R2="P2_4" # R2, G2, B2 are for the bottom rows (17-32) of pixels -G2="P2_2" -B2="P2_1" - -LA="P2_32" # Address lines for which row (1-16 or 17-32) to update -LB="P2_30" -LC="P1_31" -LD="P2_34" - -# Set everything as output ports -GPIO.setup(OE, GPIO.OUT) -GPIO.setup(LAT, GPIO.OUT) -GPIO.setup(CLK, GPIO.OUT) - -GPIO.setup(R1, GPIO.OUT) -GPIO.setup(G1, GPIO.OUT) -GPIO.setup(B1, GPIO.OUT) -GPIO.setup(R2, GPIO.OUT) -GPIO.setup(G2, GPIO.OUT) -GPIO.setup(B2, GPIO.OUT) - -GPIO.setup(LA, GPIO.OUT) -GPIO.setup(LB, GPIO.OUT) -GPIO.setup(LC, GPIO.OUT) -GPIO.setup(LD, GPIO.OUT) - -GPIO.output(OE, 0) # Enable the display -GPIO.output(LAT, 0) # Set latch to low - -while True: - for bank in range(64): - GPIO.output(LA, bank>>0&0x1) # Select rows - GPIO.output(LB, bank>>1&0x1) - GPIO.output(LC, bank>>2&0x1) - GPIO.output(LD, bank>>3&0x1) - - # Shift the colors out. Here we only have four different - # colors to keep things simple. - for i in range(16): - GPIO.output(R1, 1) # Top row, white - GPIO.output(G1, 1) - GPIO.output(B1, 1) - - GPIO.output(R2, 1) # Bottom row, red - GPIO.output(G2, 0) - GPIO.output(B2, 0) - - GPIO.output(CLK, 0) # Toggle clock - GPIO.output(CLK, 1) - - GPIO.output(R1, 0) # Top row, black - GPIO.output(G1, 0) - GPIO.output(B1, 0) - - GPIO.output(R2, 0) # Bottom row, green - GPIO.output(G2, 1) - GPIO.output(B2, 0) - - GPIO.output(CLK, 0) # Toggle clock - GPIO.output(CLK, 1) - - GPIO.output(OE, 1) # Disable display while updating - GPIO.output(LAT, 1) # Toggle latch - GPIO.output(LAT, 0) - GPIO.output(OE, 0) # Enable display diff --git a/books/pru-cookbook/05blocks/code/rgb_python_setup.sh b/books/pru-cookbook/05blocks/code/rgb_python_setup.sh deleted file mode 100755 index 72106746..00000000 --- a/books/pru-cookbook/05blocks/code/rgb_python_setup.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash -# Setup for 64x32 RGB Matrix -export TARGET=rgb1.pru0 -echo TARGET=$TARGET - -# Configure the PRU pins based on which Beagle is running -machine=$(awk '{print $NF}' /proc/device-tree/model) -echo -n $machine -if [ $machine = "Black" ]; then - echo " Found" - pins="" -elif [ $machine = "Blue" ]; then - echo " Found" - pins="" -elif [ $machine = "PocketBeagle" ]; then - echo " Found" - prupins="P2_32 P1_31 P1_33 P1_29 P2_30 P2_34 P1_36" - gpiopins="P2_10 P2_06 P2_04 P2_01 P2_08 P2_02" - # Uncomment for J2 - # gpiopins="$gpiopins P2_27 P2_25 P2_05 P2_24 P2_22 P2_18" -else - echo " Not Found" - pins="" -fi - -for pin in $prupins -do - echo $pin - # config-pin $pin pruout - config-pin $pin gpio - config-pin $pin out - config-pin -q $pin -done - -for pin in $gpiopins -do - echo $pin - config-pin $pin gpio - config-pin $pin out - config-pin -q $pin -done diff --git a/books/pru-cookbook/05blocks/code/rgb_setup.sh b/books/pru-cookbook/05blocks/code/rgb_setup.sh deleted file mode 100755 index fc545144..00000000 --- a/books/pru-cookbook/05blocks/code/rgb_setup.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash -# Setup for 64x32 RGB Matrix -export TARGET=rgb1.pru0 -echo TARGET=$TARGET - -# Configure the PRU pins based on which Beagle is running -machine=$(awk '{print $NF}' /proc/device-tree/model) -echo -n $machine -if [ $machine = "Black" ]; then - echo " Found" - pins="" -elif [ $machine = "Blue" ]; then - echo " Found" - pins="" -elif [ $machine = "PocketBeagle" ]; then - echo " Found" - prupins="P2_32 P1_31 P1_33 P1_29 P2_30 P2_34 P1_36" - gpiopins="P2_10 P2_06 P2_04 P2_01 P2_08 P2_02" - # Uncomment for J2 - # gpiopins="$gpiopins P2_27 P2_25 P2_05 P2_24 P2_22 P2_18" -else - echo " Not Found" - pins="" -fi - -for pin in $prupins -do - echo $pin - config-pin $pin pruout - # config-pin $pin gpio - # config-pin $pin out - config-pin -q $pin -done - -for pin in $gpiopins -do - echo $pin - config-pin $pin gpio - config-pin $pin out - config-pin -q $pin -done diff --git a/books/pru-cookbook/05blocks/code/rgb_white.pru0.c b/books/pru-cookbook/05blocks/code/rgb_white.pru0.c deleted file mode 100644 index e62d98e0..00000000 --- a/books/pru-cookbook/05blocks/code/rgb_white.pru0.c +++ /dev/null @@ -1,64 +0,0 @@ -// This code drives the RGB LED Matrix -// Turns all the LEDs on -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" -#include "rgb_pocket.h" - -#define DELAY 10 // Number of cycles (5ns each) to wait after a write - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - // Set up the pointers to each of the GPIO ports - uint32_t *gpio[] = { - (uint32_t *) GPIO0, - (uint32_t *) GPIO1, - (uint32_t *) GPIO2, - (uint32_t *) GPIO3 - }; - - uint32_t i, row; - - while(1) { - for(row=0; row<16; row++) { - // Set the row address - // Here we take advantage of the select bits (LA,LB,LC,LD) - // being sequential in the R30 register (bits 2,3,4,5) - // We shift row over so it lines up with the select bits - // Oring (|=) with R30 sets bits to 1 and - // Anding (&=) clears bits to 0, the 0xffc mask makes sure the - // other bits aren't changed. - __R30 |= row<<pru_sel0; - __R30 &= (row<<pru_sel0)|0xffc3; - - for(i=0; i<64; i++) { - // Top row white - // Combining these to one write works because they are all in - // the same gpio port - gpio[r11_gpio][GPIO_SETDATAOUT] = r11_pin | g11_pin | b11_pin; - __delay_cycles(DELAY);; - - // Bottom row white - gpio[r12_gpio][GPIO_SETDATAOUT] = r12_pin | g12_pin | b12_pin; - __delay_cycles(DELAY); - - __R30 |= pru_clock; // Toggle clock - __delay_cycles(DELAY); - __R30 &= ~pru_clock; - __delay_cycles(DELAY); - } - __R30 |= pru_oe; // Disable display - __delay_cycles(DELAY); - __R30 |= pru_latch; // Toggle latch - __delay_cycles(DELAY); - __R30 &= ~pru_latch; - __delay_cycles(DELAY); - __R30 &= ~pru_oe; // Enable display - __delay_cycles(DELAY); - } - } -} diff --git a/books/pru-cookbook/05blocks/code/shared.pru0.c b/books/pru-cookbook/05blocks/code/shared.pru0.c deleted file mode 100644 index 95d87c5d..00000000 --- a/books/pru-cookbook/05blocks/code/shared.pru0.c +++ /dev/null @@ -1,63 +0,0 @@ -// From: http://git.ti.com/pru-software-support-package/pru-software-support-package/blobs/master/examples/am335x/PRU_access_const_table/PRU_access_const_table.c -#include <stdint.h> -#include <pru_cfg.h> -#include <pru_ctrl.h> -#include "resource_table_empty.h" - -#define PRU_SRAM __far __attribute__((cregister("PRU_SHAREDMEM", near))) -#define PRU_DMEM0 __far __attribute__((cregister("PRU_DMEM_0_1", near))) -#define PRU_DMEM1 __far __attribute__((cregister("PRU_DMEM_1_0", near))) - -/* NOTE: Allocating shared_x to PRU Shared Memory means that other PRU cores on - * the same subsystem must take care not to allocate data to that memory. - * Users also cannot rely on where in shared memory these variables are placed - * so accessing them from another PRU core or from the ARM is an undefined behavior. - */ -volatile uint32_t shared_0; -PRU_SRAM volatile uint32_t shared_1; -PRU_DMEM0 volatile uint32_t shared_2; -PRU_DMEM1 volatile uint32_t shared_3; -#pragma DATA_SECTION(shared_4, ".bss") -volatile uint32_t shared_4; - -/* NOTE: Here we pick where in memory to store shared_5. The stack and - * heap take up the first 0x200 words, so we must start after that. - * Since we are hardcoding where things are stored we can share - * this between the PRUs and the ARM. -*/ -#define PRU0_DRAM 0x00000 // Offset to DRAM -// Skip the first 0x200 bytes of DRAM since the Makefile allocates -// 0x100 for the STACK and 0x100 for the HEAP. -volatile unsigned int *shared_5 = (unsigned int *) (PRU0_DRAM + 0x200); - - -int main(void) -{ - volatile uint32_t shared_6; - volatile uint32_t shared_7; - /*****************************************************************/ - /* Access PRU peripherals using Constant Table & PRU header file */ - /*****************************************************************/ - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - /*****************************************************************/ - /* Access PRU Shared RAM using Constant Table */ - /*****************************************************************/ - - /* C28 defaults to 0x00000000, we need to set bits 23:8 to 0x0100 in order to have it point to 0x00010000 */ - PRU0_CTRL.CTPPR0_bit.C28_BLK_POINTER = 0x0100; - - shared_0 = 0xfeef; - shared_1 = 0xdeadbeef; - shared_2 = shared_2 + 0xfeed; - shared_3 = 0xdeed; - shared_4 = 0xbeed; - shared_5[0] = 0x1234; - shared_6 = 0x4321; - shared_7 = 0x9876; - - /* Halt PRU core */ - __halt(); -} diff --git a/books/pru-cookbook/05blocks/code/shared_setup.sh b/books/pru-cookbook/05blocks/code/shared_setup.sh deleted file mode 100755 index eefbcd55..00000000 --- a/books/pru-cookbook/05blocks/code/shared_setup.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -# -export TARGET=shared.pru0 -echo TARGET=$TARGET - -# Configure the PRU pins based on which Beagle is running -machine=$(awk '{print $NF}' /proc/device-tree/model) -echo -n $machine -if [ $machine = "Black" ]; then - echo " Found" - pins="P9_31 P9_29 P9_30 P9_28" -elif [ $machine = "Blue" ]; then - echo " Found" - pins="" -elif [ $machine = "PocketBeagle" ]; then - echo " Found" - pins="P1_36 P1_33 P2_32 P2_30" -else - echo " Not Found" - pins="" -fi - -for pin in $pins -do - echo $pin - config-pin $pin pruout - config-pin -q $pin -done diff --git a/books/pru-cookbook/05blocks/code/sine.map b/books/pru-cookbook/05blocks/code/sine.map deleted file mode 100644 index 45872d39..00000000 --- a/books/pru-cookbook/05blocks/code/sine.map +++ /dev/null @@ -1,338 +0,0 @@ -****************************************************************************** -PRU Linker Unix v2.1.5 -****************************************************************************** ->> Linked Fri Jun 29 13:58:08 2018 - -OUTPUT FILE NAME: </tmp/pru0-gen/sine1.out> -ENTRY POINT SYMBOL: "_c_int00_noinit_noargs_noexit" address: 00000000 - - -MEMORY CONFIGURATION - - name origin length used unused attr fill ----------------------- -------- --------- -------- -------- ---- -------- -PAGE 0: - PRU_IMEM 00000000 00002000 000018c0 00000740 RWIX - -PAGE 1: - PRU_DMEM_0_1 00000000 00002000 00000154 00001eac RWIX - PRU_DMEM_1_0 00002000 00002000 00000000 00002000 RWIX - -PAGE 2: - PRU_SHAREDMEM 00010000 00003000 00000000 00003000 RWIX - PRU_INTC 00020000 00001504 00000000 00001504 RWIX - PRU_CFG 00026000 00000044 00000044 00000000 RWIX - PRU_UART 00028000 00000038 00000000 00000038 RWIX - PRU_IEP 0002e000 0000031c 00000000 0000031c RWIX - PRU_ECAP 00030000 00000060 00000000 00000060 RWIX - RSVD27 00032000 00000100 00000000 00000100 RWIX - RSVD21 00032400 00000100 00000000 00000100 RWIX - L3OCMC 40000000 00010000 00000000 00010000 RWIX - MCASP0_DMA 46000000 00000100 00000000 00000100 RWIX - UART1 48022000 00000088 00000000 00000088 RWIX - UART2 48024000 00000088 00000000 00000088 RWIX - I2C1 4802a000 000000d8 00000000 000000d8 RWIX - MCSPI0 48030000 000001a4 00000000 000001a4 RWIX - DMTIMER2 48040000 0000005c 00000000 0000005c RWIX - MMCHS0 48060000 00000300 00000000 00000300 RWIX - MBX0 480c8000 00000140 00000000 00000140 RWIX - SPINLOCK 480ca000 00000880 00000000 00000880 RWIX - I2C2 4819c000 000000d8 00000000 000000d8 RWIX - MCSPI1 481a0000 000001a4 00000000 000001a4 RWIX - DCAN0 481cc000 000001e8 00000000 000001e8 RWIX - DCAN1 481d0000 000001e8 00000000 000001e8 RWIX - PWMSS0 48300000 000002c4 00000000 000002c4 RWIX - PWMSS1 48302000 000002c4 00000000 000002c4 RWIX - PWMSS2 48304000 000002c4 00000000 000002c4 RWIX - RSVD13 48310000 00000100 00000000 00000100 RWIX - RSVD10 48318000 00000100 00000000 00000100 RWIX - TPCC 49000000 00001098 00000000 00001098 RWIX - GEMAC 4a100000 0000128c 00000000 0000128c RWIX - DDR 80000000 00000100 00000000 00000100 RWIX - - -SECTION ALLOCATION MAP - - output attributes/ -section page origin length input sections --------- ---- ---------- ---------- ---------------- -.text:_c_int00* -* 0 00000000 00000014 - 00000000 00000014 rtspruv3_le.lib : boot_special.obj (.text:_c_int00_noinit_noargs_noexit) - -.text 0 00000014 000018ac - 00000014 00000374 rtspruv3_le.lib : sin.obj (.text:sin) - 00000388 00000314 : frcmpyd.obj (.text:__TI_frcmpyd) - 0000069c 00000258 : frcaddd.obj (.text:__TI_frcaddd) - 000008f4 00000254 : mpyd.obj (.text:__pruabi_mpyd) - 00000b48 00000248 : addd.obj (.text:__pruabi_addd) - 00000d90 000001c8 : mpyf.obj (.text:__pruabi_mpyf) - 00000f58 00000100 : modf.obj (.text:modf) - 00001058 000000b4 : gtd.obj (.text:__pruabi_gtd) - 0000110c 000000b0 : ged.obj (.text:__pruabi_ged) - 000011bc 000000b0 : ltd.obj (.text:__pruabi_ltd) - 0000126c 000000b0 sine1.obj (.text:main) - 0000131c 000000a8 rtspruv3_le.lib : frcmpyf.obj (.text:__TI_frcmpyf) - 000013c4 000000a0 : fixdu.obj (.text:__pruabi_fixdu) - 00001464 0000009c : round.obj (.text:__pruabi_nround) - 00001500 00000090 : eqld.obj (.text:__pruabi_eqd) - 00001590 0000008c : renormd.obj (.text:__TI_renormd) - 0000161c 0000008c : fixdi.obj (.text:__pruabi_fixdi) - 000016a8 00000084 : fltid.obj (.text:__pruabi_fltid) - 0000172c 00000078 : cvtfd.obj (.text:__pruabi_cvtfd) - 000017a4 00000050 : fltuf.obj (.text:__pruabi_fltuf) - 000017f4 0000002c : asri.obj (.text:__pruabi_asri) - 00001820 0000002c : subd.obj (.text:__pruabi_subd) - 0000184c 00000024 : mpyi.obj (.text:__pruabi_mpyi) - 00001870 00000020 : negd.obj (.text:__pruabi_negd) - 00001890 00000020 : trunc.obj (.text:__pruabi_trunc) - 000018b0 00000008 : exit.obj (.text:abort) - 000018b8 00000008 : exit.obj (.text:loader_exit) - -.stack 1 00000000 00000100 UNINITIALIZED - 00000000 00000004 rtspruv3_le.lib : boot.obj (.stack) - 00000004 000000fc --HOLE-- - -.cinit 1 00000000 00000000 UNINITIALIZED - -.fardata 1 00000100 00000040 - 00000100 00000040 rtspruv3_le.lib : sin.obj (.fardata:R$1) - -.resource_table -* 1 00000140 00000014 - 00000140 00000014 sine1.obj (.resource_table:retain) - -.creg.PRU_CFG.noload.near -* 2 00026000 00000044 NOLOAD SECTION - 00026000 00000044 sine1.obj (.creg.PRU_CFG.noload.near) - -.creg.PRU_CFG.near -* 2 00026044 00000000 UNINITIALIZED - -.creg.PRU_CFG.noload.far -* 2 00026044 00000000 NOLOAD SECTION - -.creg.PRU_CFG.far -* 2 00026044 00000000 UNINITIALIZED - - -SEGMENT ATTRIBUTES - - id tag seg value - -- --- --- ----- - 0 PHA_PAGE 1 1 - 1 PHA_PAGE 2 1 - - -GLOBAL SYMBOLS: SORTED ALPHABETICALLY BY Name - -page address name ----- ------- ---- -0 000018b8 C$$EXIT -2 00026000 CT_CFG -abs 481cc000 __PRU_CREG_BASE_DCAN0 -abs 481d0000 __PRU_CREG_BASE_DCAN1 -abs 80000000 __PRU_CREG_BASE_DDR -abs 48040000 __PRU_CREG_BASE_DMTIMER2 -abs 4a100000 __PRU_CREG_BASE_GEMAC -abs 4802a000 __PRU_CREG_BASE_I2C1 -abs 4819c000 __PRU_CREG_BASE_I2C2 -abs 40000000 __PRU_CREG_BASE_L3OCMC -abs 480c8000 __PRU_CREG_BASE_MBX0 -abs 46000000 __PRU_CREG_BASE_MCASP0_DMA -abs 48030000 __PRU_CREG_BASE_MCSPI0 -abs 481a0000 __PRU_CREG_BASE_MCSPI1 -abs 48060000 __PRU_CREG_BASE_MMCHS0 -abs 00026000 __PRU_CREG_BASE_PRU_CFG -abs 00000000 __PRU_CREG_BASE_PRU_DMEM_0_1 -abs 00002000 __PRU_CREG_BASE_PRU_DMEM_1_0 -abs 00030000 __PRU_CREG_BASE_PRU_ECAP -abs 0002e000 __PRU_CREG_BASE_PRU_IEP -abs 00020000 __PRU_CREG_BASE_PRU_INTC -abs 00010000 __PRU_CREG_BASE_PRU_SHAREDMEM -abs 00028000 __PRU_CREG_BASE_PRU_UART -abs 48300000 __PRU_CREG_BASE_PWMSS0 -abs 48302000 __PRU_CREG_BASE_PWMSS1 -abs 48304000 __PRU_CREG_BASE_PWMSS2 -abs 48318000 __PRU_CREG_BASE_RSVD10 -abs 48310000 __PRU_CREG_BASE_RSVD13 -abs 00032400 __PRU_CREG_BASE_RSVD21 -abs 00032000 __PRU_CREG_BASE_RSVD27 -abs 480ca000 __PRU_CREG_BASE_SPINLOCK -abs 49000000 __PRU_CREG_BASE_TPCC -abs 48022000 __PRU_CREG_BASE_UART1 -abs 48024000 __PRU_CREG_BASE_UART2 -abs 0000000e __PRU_CREG_DCAN0 -abs 0000000f __PRU_CREG_DCAN1 -abs 0000001f __PRU_CREG_DDR -abs 00000001 __PRU_CREG_DMTIMER2 -abs 00000009 __PRU_CREG_GEMAC -abs 00000002 __PRU_CREG_I2C1 -abs 00000011 __PRU_CREG_I2C2 -abs 0000001e __PRU_CREG_L3OCMC -abs 00000016 __PRU_CREG_MBX0 -abs 00000008 __PRU_CREG_MCASP0_DMA -abs 00000006 __PRU_CREG_MCSPI0 -abs 00000010 __PRU_CREG_MCSPI1 -abs 00000005 __PRU_CREG_MMCHS0 -abs 00000004 __PRU_CREG_PRU_CFG -abs 00000018 __PRU_CREG_PRU_DMEM_0_1 -abs 00000019 __PRU_CREG_PRU_DMEM_1_0 -abs 00000003 __PRU_CREG_PRU_ECAP -abs 0000001a __PRU_CREG_PRU_IEP -abs 00000000 __PRU_CREG_PRU_INTC -abs 0000001c __PRU_CREG_PRU_SHAREDMEM -abs 00000007 __PRU_CREG_PRU_UART -abs 00000012 __PRU_CREG_PWMSS0 -abs 00000013 __PRU_CREG_PWMSS1 -abs 00000014 __PRU_CREG_PWMSS2 -abs 0000000a __PRU_CREG_RSVD10 -abs 0000000d __PRU_CREG_RSVD13 -abs 00000015 __PRU_CREG_RSVD21 -abs 0000001b __PRU_CREG_RSVD27 -abs 00000017 __PRU_CREG_SPINLOCK -abs 0000001d __PRU_CREG_TPCC -abs 0000000b __PRU_CREG_UART1 -abs 0000000c __PRU_CREG_UART2 -1 00000100 __TI_STACK_END -abs 00000100 __TI_STACK_SIZE -0 0000069c __TI_frcaddd -0 00000388 __TI_frcmpyd -0 0000131c __TI_frcmpyf -0 00001590 __TI_renormd -abs ffffffff __binit__ -abs ffffffff __c_args__ -0 00000b48 __pruabi_addd -0 000017f4 __pruabi_asri -0 0000172c __pruabi_cvtfd -0 00001500 __pruabi_eqd -0 0000161c __pruabi_fixdi -0 000013c4 __pruabi_fixdu -0 000016a8 __pruabi_fltid -0 000017a4 __pruabi_fltuf -0 0000110c __pruabi_ged -0 00001058 __pruabi_gtd -0 000011bc __pruabi_ltd -0 000008f4 __pruabi_mpyd -0 00000d90 __pruabi_mpyf -0 0000184c __pruabi_mpyi -0 00001870 __pruabi_negd -0 00001464 __pruabi_nround -0 00001820 __pruabi_subd -0 00001890 __pruabi_trunc -0 00000000 _c_int00_noinit_noargs_noexit -1 00000000 _stack -0 000018b0 abort -abs ffffffff binit -0 0000126c main -0 00000f58 modf -1 00000140 pru_remoteproc_ResourceTable -0 00000014 sin - - -GLOBAL SYMBOLS: SORTED BY Symbol Address - -page address name ----- ------- ---- -0 00000000 _c_int00_noinit_noargs_noexit -0 00000014 sin -0 00000388 __TI_frcmpyd -0 0000069c __TI_frcaddd -0 000008f4 __pruabi_mpyd -0 00000b48 __pruabi_addd -0 00000d90 __pruabi_mpyf -0 00000f58 modf -0 00001058 __pruabi_gtd -0 0000110c __pruabi_ged -0 000011bc __pruabi_ltd -0 0000126c main -0 0000131c __TI_frcmpyf -0 000013c4 __pruabi_fixdu -0 00001464 __pruabi_nround -0 00001500 __pruabi_eqd -0 00001590 __TI_renormd -0 0000161c __pruabi_fixdi -0 000016a8 __pruabi_fltid -0 0000172c __pruabi_cvtfd -0 000017a4 __pruabi_fltuf -0 000017f4 __pruabi_asri -0 00001820 __pruabi_subd -0 0000184c __pruabi_mpyi -0 00001870 __pruabi_negd -0 00001890 __pruabi_trunc -0 000018b0 abort -0 000018b8 C$$EXIT -1 00000000 _stack -1 00000100 __TI_STACK_END -1 00000140 pru_remoteproc_ResourceTable -2 00026000 CT_CFG -abs 00000000 __PRU_CREG_BASE_PRU_DMEM_0_1 -abs 00000000 __PRU_CREG_PRU_INTC -abs 00000001 __PRU_CREG_DMTIMER2 -abs 00000002 __PRU_CREG_I2C1 -abs 00000003 __PRU_CREG_PRU_ECAP -abs 00000004 __PRU_CREG_PRU_CFG -abs 00000005 __PRU_CREG_MMCHS0 -abs 00000006 __PRU_CREG_MCSPI0 -abs 00000007 __PRU_CREG_PRU_UART -abs 00000008 __PRU_CREG_MCASP0_DMA -abs 00000009 __PRU_CREG_GEMAC -abs 0000000a __PRU_CREG_RSVD10 -abs 0000000b __PRU_CREG_UART1 -abs 0000000c __PRU_CREG_UART2 -abs 0000000d __PRU_CREG_RSVD13 -abs 0000000e __PRU_CREG_DCAN0 -abs 0000000f __PRU_CREG_DCAN1 -abs 00000010 __PRU_CREG_MCSPI1 -abs 00000011 __PRU_CREG_I2C2 -abs 00000012 __PRU_CREG_PWMSS0 -abs 00000013 __PRU_CREG_PWMSS1 -abs 00000014 __PRU_CREG_PWMSS2 -abs 00000015 __PRU_CREG_RSVD21 -abs 00000016 __PRU_CREG_MBX0 -abs 00000017 __PRU_CREG_SPINLOCK -abs 00000018 __PRU_CREG_PRU_DMEM_0_1 -abs 00000019 __PRU_CREG_PRU_DMEM_1_0 -abs 0000001a __PRU_CREG_PRU_IEP -abs 0000001b __PRU_CREG_RSVD27 -abs 0000001c __PRU_CREG_PRU_SHAREDMEM -abs 0000001d __PRU_CREG_TPCC -abs 0000001e __PRU_CREG_L3OCMC -abs 0000001f __PRU_CREG_DDR -abs 00000100 __TI_STACK_SIZE -abs 00002000 __PRU_CREG_BASE_PRU_DMEM_1_0 -abs 00010000 __PRU_CREG_BASE_PRU_SHAREDMEM -abs 00020000 __PRU_CREG_BASE_PRU_INTC -abs 00026000 __PRU_CREG_BASE_PRU_CFG -abs 00028000 __PRU_CREG_BASE_PRU_UART -abs 0002e000 __PRU_CREG_BASE_PRU_IEP -abs 00030000 __PRU_CREG_BASE_PRU_ECAP -abs 00032000 __PRU_CREG_BASE_RSVD27 -abs 00032400 __PRU_CREG_BASE_RSVD21 -abs 40000000 __PRU_CREG_BASE_L3OCMC -abs 46000000 __PRU_CREG_BASE_MCASP0_DMA -abs 48022000 __PRU_CREG_BASE_UART1 -abs 48024000 __PRU_CREG_BASE_UART2 -abs 4802a000 __PRU_CREG_BASE_I2C1 -abs 48030000 __PRU_CREG_BASE_MCSPI0 -abs 48040000 __PRU_CREG_BASE_DMTIMER2 -abs 48060000 __PRU_CREG_BASE_MMCHS0 -abs 480c8000 __PRU_CREG_BASE_MBX0 -abs 480ca000 __PRU_CREG_BASE_SPINLOCK -abs 4819c000 __PRU_CREG_BASE_I2C2 -abs 481a0000 __PRU_CREG_BASE_MCSPI1 -abs 481cc000 __PRU_CREG_BASE_DCAN0 -abs 481d0000 __PRU_CREG_BASE_DCAN1 -abs 48300000 __PRU_CREG_BASE_PWMSS0 -abs 48302000 __PRU_CREG_BASE_PWMSS1 -abs 48304000 __PRU_CREG_BASE_PWMSS2 -abs 48310000 __PRU_CREG_BASE_RSVD13 -abs 48318000 __PRU_CREG_BASE_RSVD10 -abs 49000000 __PRU_CREG_BASE_TPCC -abs 4a100000 __PRU_CREG_BASE_GEMAC -abs 80000000 __PRU_CREG_BASE_DDR -abs ffffffff __binit__ -abs ffffffff __c_args__ -abs ffffffff binit - -[100 symbols] diff --git a/books/pru-cookbook/05blocks/code/sine.pru0.c b/books/pru-cookbook/05blocks/code/sine.pru0.c deleted file mode 100644 index ed6b5778..00000000 --- a/books/pru-cookbook/05blocks/code/sine.pru0.c +++ /dev/null @@ -1,58 +0,0 @@ -// Generate an analog waveform and use a filter to reconstruct it. -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include <math.h> - -#define MAXT 100 // Maximum number of time samples -#define SAWTOOTH // Pick which waveform - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - uint32_t onCount; // Current count for 1 out - uint32_t offCount; // count for 0 out - uint32_t i; - uint32_t waveform[MAXT]; // Waveform to be produced - - // Generate a periodic wave in an array of MAXT values -#ifdef SAWTOOTH - for(i=0; i<MAXT; i++) { - waveform[i] = i*100/MAXT; - } -#endif -#ifdef TRIANGLE - for(i=0; i<MAXT/2; i++) { - waveform[i] = 2*i*100/MAXT; - waveform[MAXT-i-1] = 2*i*100/MAXT; - } -#endif -#ifdef SINE - float gain = 50.0f; - float bias = 50.0f; - float freq = 2.0f * 3.14159f / MAXT; - for (i=0; i<MAXT; i++){ - waveform[i] = (uint32_t)(bias+gain*sin(i*freq)); - } -#endif - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - while (1) { - // Generate a PWM signal whose duty cycle matches - // the amplitude of the signal. - for(i=0; i<MAXT; i++) { - onCount = waveform[i]; - offCount = 100 - onCount; - while(onCount--) { - __R30 |= 0x1; // Set the GPIO pin to 1 - } - while(offCount--) { - __R30 &= ~(0x1); // Clear the GPIO pin - } - } - } -} diff --git a/books/pru-cookbook/05blocks/code/write_init_pins.sh b/books/pru-cookbook/05blocks/code/write_init_pins.sh deleted file mode 100755 index f5208236..00000000 --- a/books/pru-cookbook/05blocks/code/write_init_pins.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -init_pins=$(readelf -x .init_pins $1 | grep 0x000 | cut -d' ' -f4-7 | xxd -r -p | tr '\0' '\n' | paste - -) -while read -a line; do - if [ ${#line[@]} == 2 ]; then - echo writing \"${line[1]}\" to \"${line[0]}\" - echo ${line[1]} > ${line[0]} - sleep 0.1 - fi -done <<< "$init_pins" diff --git a/books/pru-cookbook/06io/code/Makefile b/books/pru-cookbook/06io/code/Makefile deleted file mode 100644 index a7557fda..00000000 --- a/books/pru-cookbook/06io/code/Makefile +++ /dev/null @@ -1 +0,0 @@ -include /var/lib/cloud9/common/Makefile diff --git a/books/pru-cookbook/06io/code/gpio.pru0.c b/books/pru-cookbook/06io/code/gpio.pru0.c deleted file mode 100644 index bcab90ef..00000000 --- a/books/pru-cookbook/06io/code/gpio.pru0.c +++ /dev/null @@ -1,23 +0,0 @@ -// This code accesses GPIO without using R30 and R31 -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" - -#define P9_11 (0x1<<30) // Bit position tied to P9_11 on Black -#define P2_05 (0x1<<30) // Bit position tied to P2_05 on Pocket - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - uint32_t *gpio0 = (uint32_t *)GPIO0; - - while(1) { - gpio0[GPIO_SETDATAOUT] = P9_11; - __delay_cycles(100000000); - gpio0[GPIO_CLEARDATAOUT] = P9_11; - __delay_cycles(100000000); - } -} diff --git a/books/pru-cookbook/06io/code/setup.sh b/books/pru-cookbook/06io/code/setup.sh deleted file mode 100755 index e676ed7a..00000000 --- a/books/pru-cookbook/06io/code/setup.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -export TARGET=gpio.pru0 -echo TARGET=$TARGET - -# Configure the PRU pins based on which Beagle is running -machine=$(awk '{print $NF}' /proc/device-tree/model) -echo -n $machine -if [ $machine = "Black" ]; then - echo " Found" - pins="P9_11" -elif [ $machine = "Blue" ]; then - echo " Found" - pins="" -elif [ $machine = "PocketBeagle" ]; then - echo " Found" - pins="P2_05" -else - echo " Not Found" - pins="" -fi - -for pin in $pins -do - echo $pin - config-pin $pin gpio - config-pin -q $pin -done diff --git a/books/pru-cookbook/06io/io.rst b/books/pru-cookbook/06io/io.rst index ad4fdd59..b01cf603 100644 --- a/books/pru-cookbook/06io/io.rst +++ b/books/pru-cookbook/06io/io.rst @@ -189,7 +189,7 @@ If you are using an oscilloscope, look closely and you'll see the following. PWM with jitter -The PRU is still as solid as before in it's timing, but now it's going through +The PRU is still as solid as before in its timing, but now it's going through the OCP interface. This interface is shared with other parts of the system, therefore the sometimes the PRU must wait for the other parts to finish. When this happens the pulse width is a bit longer than usual thus adding diff --git a/books/pru-cookbook/07more/code/Makefile b/books/pru-cookbook/07more/code/Makefile deleted file mode 100644 index a7557fda..00000000 --- a/books/pru-cookbook/07more/code/Makefile +++ /dev/null @@ -1 +0,0 @@ -include /var/lib/cloud9/common/Makefile diff --git a/books/pru-cookbook/07more/code/copyright.c b/books/pru-cookbook/07more/code/copyright.c deleted file mode 100644 index 63b6a419..00000000 --- a/books/pru-cookbook/07more/code/copyright.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ - * - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Texas Instruments Incorporated nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - \ No newline at end of file diff --git a/books/pru-cookbook/07more/code/cycle.pru0.c b/books/pru-cookbook/07more/code/cycle.pru0.c deleted file mode 100644 index 3217c2eb..00000000 --- a/books/pru-cookbook/07more/code/cycle.pru0.c +++ /dev/null @@ -1,32 +0,0 @@ -// Access the CYCLE and STALL registers -#include <stdint.h> -#include <pru_cfg.h> -#include <pru_ctrl.h> -#include "resource_table_empty.h" -#include "prugpio.h" - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - uint32_t gpio = P9_31; // Select which pin to toggle.; - - // These will be kept in registers and never written to DRAM - uint32_t cycle, stall; - - // Clear SYSCFG[STANDBY_INIT] to enable OCP master port - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - PRU0_CTRL.CTRL_bit.CTR_EN = 1; // Enable cycle counter - - __R30 |= gpio; // Set the GPIO pin to 1 - // Reset cycle counter, cycle is on the right side to force the compiler - // to put it in it's own register - PRU0_CTRL.CYCLE = cycle; - __R30 &= ~gpio; // Clear the GPIO pin - cycle = PRU0_CTRL.CYCLE; // Read cycle and store in a register - stall = PRU0_CTRL.STALL; // Ditto for stall - - __halt(); -} diff --git a/books/pru-cookbook/07more/code/cycle.pru0.lst b/books/pru-cookbook/07more/code/cycle.pru0.lst deleted file mode 100644 index d10187ef..00000000 --- a/books/pru-cookbook/07more/code/cycle.pru0.lst +++ /dev/null @@ -1,3082 +0,0 @@ -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 1 - - 1;****************************************************************************** - 2;* PRU C/C++ Codegen Unix v2.1.5 * - 3;* Date/Time created: Fri Jun 5 14:14:07 2020 * - 4;****************************************************************************** - 5 .compiler_opts --abi=eabi --endian=little --hll_source=on --object_format=elf --silicon_versio - 6 - 7$C$DW$CU .dwtag DW_TAG_compile_unit - 8 .dwattr $C$DW$CU, DW_AT_name("cycle.pru0.c") - 9 .dwattr $C$DW$CU, DW_AT_producer("TI PRU C/C++ Codegen Unix v2.1.5 Copyright (c) 2012-2017 Tex - 10 .dwattr $C$DW$CU, DW_AT_TI_version(0x01) - 11 .dwattr $C$DW$CU, DW_AT_comp_dir("/home/debian/PRUCookbook/docs/07more/code") - 12 .global __PRU_CREG_PRU_CFG - 13 - 14$C$DW$1 .dwtag DW_TAG_subprogram, DW_AT_name("__halt") - 15 .dwattr $C$DW$1, DW_AT_TI_symbol_name("__halt") - 16 .dwattr $C$DW$1, DW_AT_declaration - 17 .dwattr $C$DW$1, DW_AT_external - 18 .weak ||CT_CFG|| - 19 00000000 ||CT_CFG||: .usect ".creg.PRU_CFG.noload.near",68,1 - 20$C$DW$2 .dwtag DW_TAG_variable, DW_AT_name("CT_CFG") - 21 .dwattr $C$DW$2, DW_AT_TI_symbol_name("CT_CFG") - 22 .dwattr $C$DW$2, DW_AT_location[DW_OP_addr ||CT_CFG||] - 23 .dwattr $C$DW$2, DW_AT_type(*$C$DW$T$98) - 24 .dwattr $C$DW$2, DW_AT_external - 25 .dwattr $C$DW$2, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru_ - 26 .dwattr $C$DW$2, DW_AT_decl_line(0xf2) - 27 .dwattr $C$DW$2, DW_AT_decl_column(0x17) - 28 .global ||pru_remoteproc_ResourceTable|| - 29 00000000 .sect ".resource_table:retain", RW - 30 .retain - 31 .align 1 - 32 .elfsym ||pru_remoteproc_ResourceTable||,SYM_SIZE(20) - 33 00000000 ||pru_remoteproc_ResourceTable||: - 34 00000000 00000000000001 .bits 1,32 ; pru_remoteproc_ResourceTable.base.ver @ 0 - 35 00000004 00000000000000 .bits 0,32 ; pru_remoteproc_ResourceTable.base.num @ 32 - 36 00000008 00000000000000 .bits 0,32 ; pru_remoteproc_ResourceTable.base.reserved[0] @ 64 - 37 0000000c 00000000000000 .bits 0,32 ; pru_remoteproc_ResourceTable.base.reserved[1] @ 96 - 38 00000010 00000000000000 .bits 0,32 ; pru_remoteproc_ResourceTable.offset[0] @ 128 - 39 - 40$C$DW$3 .dwtag DW_TAG_variable, DW_AT_name("pru_remoteproc_ResourceTable") - 41 .dwattr $C$DW$3, DW_AT_TI_symbol_name("pru_remoteproc_ResourceTable") - 42 .dwattr $C$DW$3, DW_AT_location[DW_OP_addr ||pru_remoteproc_ResourceTable||] - 43 .dwattr $C$DW$3, DW_AT_type(*$C$DW$T$92) - 44 .dwattr $C$DW$3, DW_AT_external - 45 .dwattr $C$DW$3, DW_AT_decl_file("/var/lib/cloud9/common/resource_table_empty.h") - 46 .dwattr $C$DW$3, DW_AT_decl_line(0x1f) - 47 .dwattr $C$DW$3, DW_AT_decl_column(0x1a) - 48; optpru /tmp/TI18yQKu8QO /tmp/TI18y6Ruqzt - 49; acpiapru -@/tmp/TI18yH9tQJL - 50 00000000 .sect ".text:main" - 51 .clink - 52 .global ||main|| - 53 - 54$C$DW$4 .dwtag DW_TAG_subprogram, DW_AT_name("main") - 55 .dwattr $C$DW$4, DW_AT_low_pc(||main||) -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 2 - - 56 .dwattr $C$DW$4, DW_AT_high_pc(0x00) - 57 .dwattr $C$DW$4, DW_AT_TI_symbol_name("main") - 58 .dwattr $C$DW$4, DW_AT_external - 59 .dwattr $C$DW$4, DW_AT_TI_begin_file("cycle.pru0.c") - 60 .dwattr $C$DW$4, DW_AT_TI_begin_line(0x0d) - 61 .dwattr $C$DW$4, DW_AT_TI_begin_column(0x06) - 62 .dwattr $C$DW$4, DW_AT_decl_file("cycle.pru0.c") - 63 .dwattr $C$DW$4, DW_AT_decl_line(0x0d) - 64 .dwattr $C$DW$4, DW_AT_decl_column(0x06) - 65 .dwattr $C$DW$4, DW_AT_TI_max_frame_size(0x00) - 66 .dwpsn file "cycle.pru0.c",line 14,column 1,is_stmt,address ||main||,isa 0 - 67 - 68 .dwfde $C$DW$CIE, ||main|| - 69;---------------------------------------------------------------------- - 70; 13 | void main(void) - 71; 15 | uint32_t gpio = P9_31; // Select which pin to toggle.; - 72; 17 | // These will be kept in registers and never written to DRAM - 73; 18 | uint32_t cycle, stall; - 74; 20 | // Clear SYSCFG[STANDBY_INIT] to enable OCP master port - 75;---------------------------------------------------------------------- - 76 - 77;*************************************************************** - 78;* FNAME: main FR SIZE: 0 * - 79;* * - 80;* FUNCTION ENVIRONMENT * - 81;* * - 82;* FUNCTION PROPERTIES * - 83;* 0 Auto, 0 SOE * - 84;*************************************************************** - 85 - 86||main||: - 87;* --------------------------------------------------------------------------* - 88;* r0_0 assigned to $O$C1 - 89;* r14_0 assigned to cycle - 90$C$DW$5 .dwtag DW_TAG_variable, DW_AT_name("cycle") - 91 .dwattr $C$DW$5, DW_AT_TI_symbol_name("cycle") - 92 .dwattr $C$DW$5, DW_AT_type(*$C$DW$T$32) - 93 .dwattr $C$DW$5, DW_AT_location[DW_OP_regx 0x38] - 94 .dwcfi cfa_offset, 0 - 95 .dwpsn file "cycle.pru0.c",line 21,column 2,is_stmt,isa 0 - 96;---------------------------------------------------------------------- - 97; 21 | CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - 98;---------------------------------------------------------------------- - 99 00000000 00000091042080! LBCO &r0, __PRU_CREG_PRU_CFG, $CSBREL(||CT_CFG||+4), 4 ; [ALU_PRU] |21| CT_CFG - 100 00000004 0000001D04E0E0 CLR r0, r0, 0x00000004 ; [ALU_PRU] |21| - 101 00000008 00000081042080! SBCO &r0, __PRU_CREG_PRU_CFG, $CSBREL(||CT_CFG||+4), 4 ; [ALU_PRU] |21| CT_CFG - 102 .dwpsn file "cycle.pru0.c",line 23,column 2,is_stmt,isa 0 - 103;---------------------------------------------------------------------- - 104; 23 | PRU0_CTRL.CTRL_bit.CTR_EN = 1; // Enable cycle counter - 105;---------------------------------------------------------------------- - 106 0000000c 200080240002C0 LDI32 r0, 0x00022000 ; [ALU_PRU] |23| $O$C1 - 107 00000014 000000F1002081 LBBO &r1, r0, 0, 4 ; [ALU_PRU] |23| - 108 00000018 0000001F03E1E1 SET r1, r1, 0x00000003 ; [ALU_PRU] |23| - 109 0000001c 000000E1002081 SBBO &r1, r0, 0, 4 ; [ALU_PRU] |23| - 110 .dwpsn file "cycle.pru0.c",line 25,column 2,is_stmt,isa 0 -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 3 - - 111;---------------------------------------------------------------------- - 112; 25 | __R30 |= gpio; // Set the GPIO pin to 1 - 113; 26 | // Reset cycle counter, cycle is on the right side to force the compile - 114; | r - 115; 27 | // to put it in it's own register - 116;---------------------------------------------------------------------- - 117 00000020 0000001F00FEFE SET r30, r30, 0x00000000 ; [ALU_PRU] |25| - 118 .dwpsn file "cycle.pru0.c",line 28,column 2,is_stmt,isa 0 - 119;---------------------------------------------------------------------- - 120; 28 | PRU0_CTRL.CYCLE = cycle; - 121;---------------------------------------------------------------------- - 122 00000024 000000E10C208E SBBO &r14, r0, 12, 4 ; [ALU_PRU] |28| $O$C1,cycle - 123 .dwpsn file "cycle.pru0.c",line 29,column 2,is_stmt,isa 0 - 124;---------------------------------------------------------------------- - 125; 29 | __R30 &= ~gpio; // Clear the GPIO pin - 126;---------------------------------------------------------------------- - 127 00000028 0000001D00FEFE CLR r30, r30, 0x00000000 ; [ALU_PRU] |29| - 128 .dwpsn file "cycle.pru0.c",line 30,column 2,is_stmt,isa 0 - 129;---------------------------------------------------------------------- - 130; 30 | cycle = PRU0_CTRL.CYCLE; // Read cycle and store in a register - 131;---------------------------------------------------------------------- - 132 0000002c 000000F10C2081 LBBO &r1, r0, 12, 4 ; [ALU_PRU] |30| $O$C1 - 133 .dwpsn file "cycle.pru0.c",line 31,column 2,is_stmt,isa 0 - 134;---------------------------------------------------------------------- - 135; 31 | stall = PRU0_CTRL.STALL; // Ditto for stall - 136;---------------------------------------------------------------------- - 137 00000030 000000F1102080 LBBO &r0, r0, 16, 4 ; [ALU_PRU] |31| $O$C1 - 138 .dwpsn file "cycle.pru0.c",line 33,column 2,is_stmt,isa 0 - 139;---------------------------------------------------------------------- - 140; 33 | __halt(); - 141;---------------------------------------------------------------------- - 142 00000034 0000002A000000 HALT ; [ALU_PRU] |33| - 143$C$DW$6 .dwtag DW_TAG_TI_branch - 144 .dwattr $C$DW$6, DW_AT_low_pc(0x00) - 145 .dwattr $C$DW$6, DW_AT_TI_return - 146 00000038 00000020C30000 JMP r3.w2 ; [ALU_PRU] - 147 .dwattr $C$DW$4, DW_AT_TI_end_file("cycle.pru0.c") - 148 .dwattr $C$DW$4, DW_AT_TI_end_line(0x22) - 149 .dwattr $C$DW$4, DW_AT_TI_end_column(0x01) - 150 .dwendentry - 151 .dwendtag $C$DW$4 - 152 - 153 - 154;****************************************************************************** - 155;* TYPE INFORMATION * - 156;****************************************************************************** - 157 - 158$C$DW$T$19 .dwtag DW_TAG_structure_type - 159 .dwattr $C$DW$T$19, DW_AT_byte_size(0x04) - 160$C$DW$7 .dwtag DW_TAG_member - 161 .dwattr $C$DW$7, DW_AT_type(*$C$DW$T$11) - 162 .dwattr $C$DW$7, DW_AT_name("REVID") - 163 .dwattr $C$DW$7, DW_AT_TI_symbol_name("REVID") - 164 .dwattr $C$DW$7, DW_AT_bit_offset(0x00), DW_AT_bit_size(0x20) - 165 .dwattr $C$DW$7, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 4 - - 166 .dwattr $C$DW$7, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 167 .dwattr $C$DW$7, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru_ - 168 .dwattr $C$DW$7, DW_AT_decl_line(0x2d) - 169 .dwattr $C$DW$7, DW_AT_decl_column(0x0d) - 170 .dwendtag $C$DW$T$19 - 171 - 172 .dwattr $C$DW$T$19, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 173 .dwattr $C$DW$T$19, DW_AT_decl_line(0x2c) - 174 .dwattr $C$DW$T$19, DW_AT_decl_column(0x13) - 175$C$DW$T$48 .dwtag DW_TAG_volatile_type - 176 .dwattr $C$DW$T$48, DW_AT_type(*$C$DW$T$19) - 177 - 178$C$DW$T$20 .dwtag DW_TAG_structure_type - 179 .dwattr $C$DW$T$20, DW_AT_byte_size(0x04) - 180$C$DW$8 .dwtag DW_TAG_member - 181 .dwattr $C$DW$8, DW_AT_type(*$C$DW$T$11) - 182 .dwattr $C$DW$8, DW_AT_name("IDLE_MODE") - 183 .dwattr $C$DW$8, DW_AT_TI_symbol_name("IDLE_MODE") - 184 .dwattr $C$DW$8, DW_AT_bit_offset(0x1e), DW_AT_bit_size(0x02) - 185 .dwattr $C$DW$8, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 186 .dwattr $C$DW$8, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 187 .dwattr $C$DW$8, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru_ - 188 .dwattr $C$DW$8, DW_AT_decl_line(0x37) - 189 .dwattr $C$DW$8, DW_AT_decl_column(0x0d) - 190$C$DW$9 .dwtag DW_TAG_member - 191 .dwattr $C$DW$9, DW_AT_type(*$C$DW$T$11) - 192 .dwattr $C$DW$9, DW_AT_name("STANDBY_MODE") - 193 .dwattr $C$DW$9, DW_AT_TI_symbol_name("STANDBY_MODE") - 194 .dwattr $C$DW$9, DW_AT_bit_offset(0x1c), DW_AT_bit_size(0x02) - 195 .dwattr $C$DW$9, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 196 .dwattr $C$DW$9, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 197 .dwattr $C$DW$9, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru_ - 198 .dwattr $C$DW$9, DW_AT_decl_line(0x38) - 199 .dwattr $C$DW$9, DW_AT_decl_column(0x0d) - 200$C$DW$10 .dwtag DW_TAG_member - 201 .dwattr $C$DW$10, DW_AT_type(*$C$DW$T$11) - 202 .dwattr $C$DW$10, DW_AT_name("STANDBY_INIT") - 203 .dwattr $C$DW$10, DW_AT_TI_symbol_name("STANDBY_INIT") - 204 .dwattr $C$DW$10, DW_AT_bit_offset(0x1b), DW_AT_bit_size(0x01) - 205 .dwattr $C$DW$10, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 206 .dwattr $C$DW$10, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 207 .dwattr $C$DW$10, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 208 .dwattr $C$DW$10, DW_AT_decl_line(0x39) - 209 .dwattr $C$DW$10, DW_AT_decl_column(0x0d) - 210$C$DW$11 .dwtag DW_TAG_member - 211 .dwattr $C$DW$11, DW_AT_type(*$C$DW$T$11) - 212 .dwattr $C$DW$11, DW_AT_name("SUB_MWAIT") - 213 .dwattr $C$DW$11, DW_AT_TI_symbol_name("SUB_MWAIT") - 214 .dwattr $C$DW$11, DW_AT_bit_offset(0x1a), DW_AT_bit_size(0x01) - 215 .dwattr $C$DW$11, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 216 .dwattr $C$DW$11, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 217 .dwattr $C$DW$11, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 218 .dwattr $C$DW$11, DW_AT_decl_line(0x3a) - 219 .dwattr $C$DW$11, DW_AT_decl_column(0x0d) - 220$C$DW$12 .dwtag DW_TAG_member -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 5 - - 221 .dwattr $C$DW$12, DW_AT_type(*$C$DW$T$11) - 222 .dwattr $C$DW$12, DW_AT_name("rsvd6") - 223 .dwattr $C$DW$12, DW_AT_TI_symbol_name("rsvd6") - 224 .dwattr $C$DW$12, DW_AT_bit_offset(0x00), DW_AT_bit_size(0x1a) - 225 .dwattr $C$DW$12, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 226 .dwattr $C$DW$12, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 227 .dwattr $C$DW$12, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 228 .dwattr $C$DW$12, DW_AT_decl_line(0x3b) - 229 .dwattr $C$DW$12, DW_AT_decl_column(0x0d) - 230 .dwendtag $C$DW$T$20 - 231 - 232 .dwattr $C$DW$T$20, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 233 .dwattr $C$DW$T$20, DW_AT_decl_line(0x36) - 234 .dwattr $C$DW$T$20, DW_AT_decl_column(0x13) - 235$C$DW$T$50 .dwtag DW_TAG_volatile_type - 236 .dwattr $C$DW$T$50, DW_AT_type(*$C$DW$T$20) - 237 - 238$C$DW$T$21 .dwtag DW_TAG_structure_type - 239 .dwattr $C$DW$T$21, DW_AT_byte_size(0x04) - 240$C$DW$13 .dwtag DW_TAG_member - 241 .dwattr $C$DW$13, DW_AT_type(*$C$DW$T$11) - 242 .dwattr $C$DW$13, DW_AT_name("PRU0_GPI_MODE") - 243 .dwattr $C$DW$13, DW_AT_TI_symbol_name("PRU0_GPI_MODE") - 244 .dwattr $C$DW$13, DW_AT_bit_offset(0x1e), DW_AT_bit_size(0x02) - 245 .dwattr $C$DW$13, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 246 .dwattr $C$DW$13, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 247 .dwattr $C$DW$13, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 248 .dwattr $C$DW$13, DW_AT_decl_line(0x45) - 249 .dwattr $C$DW$13, DW_AT_decl_column(0x0d) - 250$C$DW$14 .dwtag DW_TAG_member - 251 .dwattr $C$DW$14, DW_AT_type(*$C$DW$T$11) - 252 .dwattr $C$DW$14, DW_AT_name("PRU0_GPI_CLK_MODE") - 253 .dwattr $C$DW$14, DW_AT_TI_symbol_name("PRU0_GPI_CLK_MODE") - 254 .dwattr $C$DW$14, DW_AT_bit_offset(0x1d), DW_AT_bit_size(0x01) - 255 .dwattr $C$DW$14, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 256 .dwattr $C$DW$14, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 257 .dwattr $C$DW$14, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 258 .dwattr $C$DW$14, DW_AT_decl_line(0x46) - 259 .dwattr $C$DW$14, DW_AT_decl_column(0x0d) - 260$C$DW$15 .dwtag DW_TAG_member - 261 .dwattr $C$DW$15, DW_AT_type(*$C$DW$T$11) - 262 .dwattr $C$DW$15, DW_AT_name("PRU0_GPI_DIV0") - 263 .dwattr $C$DW$15, DW_AT_TI_symbol_name("PRU0_GPI_DIV0") - 264 .dwattr $C$DW$15, DW_AT_bit_offset(0x18), DW_AT_bit_size(0x05) - 265 .dwattr $C$DW$15, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 266 .dwattr $C$DW$15, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 267 .dwattr $C$DW$15, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 268 .dwattr $C$DW$15, DW_AT_decl_line(0x47) - 269 .dwattr $C$DW$15, DW_AT_decl_column(0x0d) - 270$C$DW$16 .dwtag DW_TAG_member - 271 .dwattr $C$DW$16, DW_AT_type(*$C$DW$T$11) - 272 .dwattr $C$DW$16, DW_AT_name("PRU0_GPI_DIV1") - 273 .dwattr $C$DW$16, DW_AT_TI_symbol_name("PRU0_GPI_DIV1") - 274 .dwattr $C$DW$16, DW_AT_bit_offset(0x13), DW_AT_bit_size(0x05) - 275 .dwattr $C$DW$16, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 6 - - 276 .dwattr $C$DW$16, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 277 .dwattr $C$DW$16, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 278 .dwattr $C$DW$16, DW_AT_decl_line(0x48) - 279 .dwattr $C$DW$16, DW_AT_decl_column(0x0d) - 280$C$DW$17 .dwtag DW_TAG_member - 281 .dwattr $C$DW$17, DW_AT_type(*$C$DW$T$11) - 282 .dwattr $C$DW$17, DW_AT_name("PRU0_GPI_SB") - 283 .dwattr $C$DW$17, DW_AT_TI_symbol_name("PRU0_GPI_SB") - 284 .dwattr $C$DW$17, DW_AT_bit_offset(0x12), DW_AT_bit_size(0x01) - 285 .dwattr $C$DW$17, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 286 .dwattr $C$DW$17, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 287 .dwattr $C$DW$17, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 288 .dwattr $C$DW$17, DW_AT_decl_line(0x49) - 289 .dwattr $C$DW$17, DW_AT_decl_column(0x0d) - 290$C$DW$18 .dwtag DW_TAG_member - 291 .dwattr $C$DW$18, DW_AT_type(*$C$DW$T$11) - 292 .dwattr $C$DW$18, DW_AT_name("PRU0_GPO_MODE") - 293 .dwattr $C$DW$18, DW_AT_TI_symbol_name("PRU0_GPO_MODE") - 294 .dwattr $C$DW$18, DW_AT_bit_offset(0x11), DW_AT_bit_size(0x01) - 295 .dwattr $C$DW$18, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 296 .dwattr $C$DW$18, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 297 .dwattr $C$DW$18, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 298 .dwattr $C$DW$18, DW_AT_decl_line(0x4a) - 299 .dwattr $C$DW$18, DW_AT_decl_column(0x0d) - 300$C$DW$19 .dwtag DW_TAG_member - 301 .dwattr $C$DW$19, DW_AT_type(*$C$DW$T$11) - 302 .dwattr $C$DW$19, DW_AT_name("PRU0_GPO_DIV0") - 303 .dwattr $C$DW$19, DW_AT_TI_symbol_name("PRU0_GPO_DIV0") - 304 .dwattr $C$DW$19, DW_AT_bit_offset(0x0c), DW_AT_bit_size(0x05) - 305 .dwattr $C$DW$19, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 306 .dwattr $C$DW$19, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 307 .dwattr $C$DW$19, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 308 .dwattr $C$DW$19, DW_AT_decl_line(0x4b) - 309 .dwattr $C$DW$19, DW_AT_decl_column(0x0d) - 310$C$DW$20 .dwtag DW_TAG_member - 311 .dwattr $C$DW$20, DW_AT_type(*$C$DW$T$11) - 312 .dwattr $C$DW$20, DW_AT_name("PRU0_GPO_DIV1") - 313 .dwattr $C$DW$20, DW_AT_TI_symbol_name("PRU0_GPO_DIV1") - 314 .dwattr $C$DW$20, DW_AT_bit_offset(0x07), DW_AT_bit_size(0x05) - 315 .dwattr $C$DW$20, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 316 .dwattr $C$DW$20, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 317 .dwattr $C$DW$20, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 318 .dwattr $C$DW$20, DW_AT_decl_line(0x4c) - 319 .dwattr $C$DW$20, DW_AT_decl_column(0x0d) - 320$C$DW$21 .dwtag DW_TAG_member - 321 .dwattr $C$DW$21, DW_AT_type(*$C$DW$T$11) - 322 .dwattr $C$DW$21, DW_AT_name("PRU0_GPO_SH_SEL") - 323 .dwattr $C$DW$21, DW_AT_TI_symbol_name("PRU0_GPO_SH_SEL") - 324 .dwattr $C$DW$21, DW_AT_bit_offset(0x06), DW_AT_bit_size(0x01) - 325 .dwattr $C$DW$21, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 326 .dwattr $C$DW$21, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 327 .dwattr $C$DW$21, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 328 .dwattr $C$DW$21, DW_AT_decl_line(0x4d) - 329 .dwattr $C$DW$21, DW_AT_decl_column(0x0d) - 330$C$DW$22 .dwtag DW_TAG_member -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 7 - - 331 .dwattr $C$DW$22, DW_AT_type(*$C$DW$T$11) - 332 .dwattr $C$DW$22, DW_AT_name("rsvd26") - 333 .dwattr $C$DW$22, DW_AT_TI_symbol_name("rsvd26") - 334 .dwattr $C$DW$22, DW_AT_bit_offset(0x00), DW_AT_bit_size(0x06) - 335 .dwattr $C$DW$22, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 336 .dwattr $C$DW$22, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 337 .dwattr $C$DW$22, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 338 .dwattr $C$DW$22, DW_AT_decl_line(0x4e) - 339 .dwattr $C$DW$22, DW_AT_decl_column(0x0d) - 340 .dwendtag $C$DW$T$21 - 341 - 342 .dwattr $C$DW$T$21, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 343 .dwattr $C$DW$T$21, DW_AT_decl_line(0x44) - 344 .dwattr $C$DW$T$21, DW_AT_decl_column(0x13) - 345$C$DW$T$52 .dwtag DW_TAG_volatile_type - 346 .dwattr $C$DW$T$52, DW_AT_type(*$C$DW$T$21) - 347 - 348$C$DW$T$22 .dwtag DW_TAG_structure_type - 349 .dwattr $C$DW$T$22, DW_AT_byte_size(0x04) - 350$C$DW$23 .dwtag DW_TAG_member - 351 .dwattr $C$DW$23, DW_AT_type(*$C$DW$T$11) - 352 .dwattr $C$DW$23, DW_AT_name("PRU1_GPI_MODE") - 353 .dwattr $C$DW$23, DW_AT_TI_symbol_name("PRU1_GPI_MODE") - 354 .dwattr $C$DW$23, DW_AT_bit_offset(0x1e), DW_AT_bit_size(0x02) - 355 .dwattr $C$DW$23, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 356 .dwattr $C$DW$23, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 357 .dwattr $C$DW$23, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 358 .dwattr $C$DW$23, DW_AT_decl_line(0x58) - 359 .dwattr $C$DW$23, DW_AT_decl_column(0x0d) - 360$C$DW$24 .dwtag DW_TAG_member - 361 .dwattr $C$DW$24, DW_AT_type(*$C$DW$T$11) - 362 .dwattr $C$DW$24, DW_AT_name("PRU1_GPI_CLK_MODE") - 363 .dwattr $C$DW$24, DW_AT_TI_symbol_name("PRU1_GPI_CLK_MODE") - 364 .dwattr $C$DW$24, DW_AT_bit_offset(0x1d), DW_AT_bit_size(0x01) - 365 .dwattr $C$DW$24, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 366 .dwattr $C$DW$24, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 367 .dwattr $C$DW$24, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 368 .dwattr $C$DW$24, DW_AT_decl_line(0x59) - 369 .dwattr $C$DW$24, DW_AT_decl_column(0x0d) - 370$C$DW$25 .dwtag DW_TAG_member - 371 .dwattr $C$DW$25, DW_AT_type(*$C$DW$T$11) - 372 .dwattr $C$DW$25, DW_AT_name("PRU1_GPI_DIV0") - 373 .dwattr $C$DW$25, DW_AT_TI_symbol_name("PRU1_GPI_DIV0") - 374 .dwattr $C$DW$25, DW_AT_bit_offset(0x18), DW_AT_bit_size(0x05) - 375 .dwattr $C$DW$25, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 376 .dwattr $C$DW$25, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 377 .dwattr $C$DW$25, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 378 .dwattr $C$DW$25, DW_AT_decl_line(0x5a) - 379 .dwattr $C$DW$25, DW_AT_decl_column(0x0d) - 380$C$DW$26 .dwtag DW_TAG_member - 381 .dwattr $C$DW$26, DW_AT_type(*$C$DW$T$11) - 382 .dwattr $C$DW$26, DW_AT_name("PRU1_GPI_DIV1") - 383 .dwattr $C$DW$26, DW_AT_TI_symbol_name("PRU1_GPI_DIV1") - 384 .dwattr $C$DW$26, DW_AT_bit_offset(0x13), DW_AT_bit_size(0x05) - 385 .dwattr $C$DW$26, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 8 - - 386 .dwattr $C$DW$26, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 387 .dwattr $C$DW$26, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 388 .dwattr $C$DW$26, DW_AT_decl_line(0x5b) - 389 .dwattr $C$DW$26, DW_AT_decl_column(0x0d) - 390$C$DW$27 .dwtag DW_TAG_member - 391 .dwattr $C$DW$27, DW_AT_type(*$C$DW$T$11) - 392 .dwattr $C$DW$27, DW_AT_name("PRU1_GPI_SB") - 393 .dwattr $C$DW$27, DW_AT_TI_symbol_name("PRU1_GPI_SB") - 394 .dwattr $C$DW$27, DW_AT_bit_offset(0x12), DW_AT_bit_size(0x01) - 395 .dwattr $C$DW$27, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 396 .dwattr $C$DW$27, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 397 .dwattr $C$DW$27, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 398 .dwattr $C$DW$27, DW_AT_decl_line(0x5c) - 399 .dwattr $C$DW$27, DW_AT_decl_column(0x0d) - 400$C$DW$28 .dwtag DW_TAG_member - 401 .dwattr $C$DW$28, DW_AT_type(*$C$DW$T$11) - 402 .dwattr $C$DW$28, DW_AT_name("PRU1_GPO_MODE") - 403 .dwattr $C$DW$28, DW_AT_TI_symbol_name("PRU1_GPO_MODE") - 404 .dwattr $C$DW$28, DW_AT_bit_offset(0x11), DW_AT_bit_size(0x01) - 405 .dwattr $C$DW$28, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 406 .dwattr $C$DW$28, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 407 .dwattr $C$DW$28, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 408 .dwattr $C$DW$28, DW_AT_decl_line(0x5d) - 409 .dwattr $C$DW$28, DW_AT_decl_column(0x0d) - 410$C$DW$29 .dwtag DW_TAG_member - 411 .dwattr $C$DW$29, DW_AT_type(*$C$DW$T$11) - 412 .dwattr $C$DW$29, DW_AT_name("PRU1_GPO_DIV0") - 413 .dwattr $C$DW$29, DW_AT_TI_symbol_name("PRU1_GPO_DIV0") - 414 .dwattr $C$DW$29, DW_AT_bit_offset(0x0c), DW_AT_bit_size(0x05) - 415 .dwattr $C$DW$29, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 416 .dwattr $C$DW$29, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 417 .dwattr $C$DW$29, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 418 .dwattr $C$DW$29, DW_AT_decl_line(0x5e) - 419 .dwattr $C$DW$29, DW_AT_decl_column(0x0d) - 420$C$DW$30 .dwtag DW_TAG_member - 421 .dwattr $C$DW$30, DW_AT_type(*$C$DW$T$11) - 422 .dwattr $C$DW$30, DW_AT_name("PRU1_GPO_DIV1") - 423 .dwattr $C$DW$30, DW_AT_TI_symbol_name("PRU1_GPO_DIV1") - 424 .dwattr $C$DW$30, DW_AT_bit_offset(0x07), DW_AT_bit_size(0x05) - 425 .dwattr $C$DW$30, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 426 .dwattr $C$DW$30, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 427 .dwattr $C$DW$30, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 428 .dwattr $C$DW$30, DW_AT_decl_line(0x5f) - 429 .dwattr $C$DW$30, DW_AT_decl_column(0x0d) - 430$C$DW$31 .dwtag DW_TAG_member - 431 .dwattr $C$DW$31, DW_AT_type(*$C$DW$T$11) - 432 .dwattr $C$DW$31, DW_AT_name("PRU1_GPO_SH_SEL") - 433 .dwattr $C$DW$31, DW_AT_TI_symbol_name("PRU1_GPO_SH_SEL") - 434 .dwattr $C$DW$31, DW_AT_bit_offset(0x06), DW_AT_bit_size(0x01) - 435 .dwattr $C$DW$31, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 436 .dwattr $C$DW$31, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 437 .dwattr $C$DW$31, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 438 .dwattr $C$DW$31, DW_AT_decl_line(0x60) - 439 .dwattr $C$DW$31, DW_AT_decl_column(0x0d) - 440$C$DW$32 .dwtag DW_TAG_member -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 9 - - 441 .dwattr $C$DW$32, DW_AT_type(*$C$DW$T$11) - 442 .dwattr $C$DW$32, DW_AT_name("rsvd26") - 443 .dwattr $C$DW$32, DW_AT_TI_symbol_name("rsvd26") - 444 .dwattr $C$DW$32, DW_AT_bit_offset(0x00), DW_AT_bit_size(0x06) - 445 .dwattr $C$DW$32, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 446 .dwattr $C$DW$32, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 447 .dwattr $C$DW$32, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 448 .dwattr $C$DW$32, DW_AT_decl_line(0x61) - 449 .dwattr $C$DW$32, DW_AT_decl_column(0x0d) - 450 .dwendtag $C$DW$T$22 - 451 - 452 .dwattr $C$DW$T$22, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 453 .dwattr $C$DW$T$22, DW_AT_decl_line(0x57) - 454 .dwattr $C$DW$T$22, DW_AT_decl_column(0x13) - 455$C$DW$T$54 .dwtag DW_TAG_volatile_type - 456 .dwattr $C$DW$T$54, DW_AT_type(*$C$DW$T$22) - 457 - 458$C$DW$T$23 .dwtag DW_TAG_structure_type - 459 .dwattr $C$DW$T$23, DW_AT_byte_size(0x04) - 460$C$DW$33 .dwtag DW_TAG_member - 461 .dwattr $C$DW$33, DW_AT_type(*$C$DW$T$11) - 462 .dwattr $C$DW$33, DW_AT_name("PRU0_CLK_STOP_REQ") - 463 .dwattr $C$DW$33, DW_AT_TI_symbol_name("PRU0_CLK_STOP_REQ") - 464 .dwattr $C$DW$33, DW_AT_bit_offset(0x1f), DW_AT_bit_size(0x01) - 465 .dwattr $C$DW$33, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 466 .dwattr $C$DW$33, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 467 .dwattr $C$DW$33, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 468 .dwattr $C$DW$33, DW_AT_decl_line(0x6b) - 469 .dwattr $C$DW$33, DW_AT_decl_column(0x0d) - 470$C$DW$34 .dwtag DW_TAG_member - 471 .dwattr $C$DW$34, DW_AT_type(*$C$DW$T$11) - 472 .dwattr $C$DW$34, DW_AT_name("PRU0_CLK_STOP_ACK") - 473 .dwattr $C$DW$34, DW_AT_TI_symbol_name("PRU0_CLK_STOP_ACK") - 474 .dwattr $C$DW$34, DW_AT_bit_offset(0x1e), DW_AT_bit_size(0x01) - 475 .dwattr $C$DW$34, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 476 .dwattr $C$DW$34, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 477 .dwattr $C$DW$34, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 478 .dwattr $C$DW$34, DW_AT_decl_line(0x6c) - 479 .dwattr $C$DW$34, DW_AT_decl_column(0x0d) - 480$C$DW$35 .dwtag DW_TAG_member - 481 .dwattr $C$DW$35, DW_AT_type(*$C$DW$T$11) - 482 .dwattr $C$DW$35, DW_AT_name("PRU0_CLK_EN") - 483 .dwattr $C$DW$35, DW_AT_TI_symbol_name("PRU0_CLK_EN") - 484 .dwattr $C$DW$35, DW_AT_bit_offset(0x1d), DW_AT_bit_size(0x01) - 485 .dwattr $C$DW$35, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 486 .dwattr $C$DW$35, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 487 .dwattr $C$DW$35, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 488 .dwattr $C$DW$35, DW_AT_decl_line(0x6d) - 489 .dwattr $C$DW$35, DW_AT_decl_column(0x0d) - 490$C$DW$36 .dwtag DW_TAG_member - 491 .dwattr $C$DW$36, DW_AT_type(*$C$DW$T$11) - 492 .dwattr $C$DW$36, DW_AT_name("PRU1_CLK_STOP_REQ") - 493 .dwattr $C$DW$36, DW_AT_TI_symbol_name("PRU1_CLK_STOP_REQ") - 494 .dwattr $C$DW$36, DW_AT_bit_offset(0x1c), DW_AT_bit_size(0x01) - 495 .dwattr $C$DW$36, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 10 - - 496 .dwattr $C$DW$36, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 497 .dwattr $C$DW$36, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 498 .dwattr $C$DW$36, DW_AT_decl_line(0x6e) - 499 .dwattr $C$DW$36, DW_AT_decl_column(0x0d) - 500$C$DW$37 .dwtag DW_TAG_member - 501 .dwattr $C$DW$37, DW_AT_type(*$C$DW$T$11) - 502 .dwattr $C$DW$37, DW_AT_name("PRU1_CLK_STOP_ACK") - 503 .dwattr $C$DW$37, DW_AT_TI_symbol_name("PRU1_CLK_STOP_ACK") - 504 .dwattr $C$DW$37, DW_AT_bit_offset(0x1b), DW_AT_bit_size(0x01) - 505 .dwattr $C$DW$37, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 506 .dwattr $C$DW$37, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 507 .dwattr $C$DW$37, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 508 .dwattr $C$DW$37, DW_AT_decl_line(0x6f) - 509 .dwattr $C$DW$37, DW_AT_decl_column(0x0d) - 510$C$DW$38 .dwtag DW_TAG_member - 511 .dwattr $C$DW$38, DW_AT_type(*$C$DW$T$11) - 512 .dwattr $C$DW$38, DW_AT_name("PRU1_CLK_EN") - 513 .dwattr $C$DW$38, DW_AT_TI_symbol_name("PRU1_CLK_EN") - 514 .dwattr $C$DW$38, DW_AT_bit_offset(0x1a), DW_AT_bit_size(0x01) - 515 .dwattr $C$DW$38, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 516 .dwattr $C$DW$38, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 517 .dwattr $C$DW$38, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 518 .dwattr $C$DW$38, DW_AT_decl_line(0x70) - 519 .dwattr $C$DW$38, DW_AT_decl_column(0x0d) - 520$C$DW$39 .dwtag DW_TAG_member - 521 .dwattr $C$DW$39, DW_AT_type(*$C$DW$T$11) - 522 .dwattr $C$DW$39, DW_AT_name("INTC_CLK_STOP_REQ") - 523 .dwattr $C$DW$39, DW_AT_TI_symbol_name("INTC_CLK_STOP_REQ") - 524 .dwattr $C$DW$39, DW_AT_bit_offset(0x19), DW_AT_bit_size(0x01) - 525 .dwattr $C$DW$39, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 526 .dwattr $C$DW$39, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 527 .dwattr $C$DW$39, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 528 .dwattr $C$DW$39, DW_AT_decl_line(0x71) - 529 .dwattr $C$DW$39, DW_AT_decl_column(0x0d) - 530$C$DW$40 .dwtag DW_TAG_member - 531 .dwattr $C$DW$40, DW_AT_type(*$C$DW$T$11) - 532 .dwattr $C$DW$40, DW_AT_name("INTC_CLK_STOP_ACK") - 533 .dwattr $C$DW$40, DW_AT_TI_symbol_name("INTC_CLK_STOP_ACK") - 534 .dwattr $C$DW$40, DW_AT_bit_offset(0x18), DW_AT_bit_size(0x01) - 535 .dwattr $C$DW$40, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 536 .dwattr $C$DW$40, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 537 .dwattr $C$DW$40, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 538 .dwattr $C$DW$40, DW_AT_decl_line(0x72) - 539 .dwattr $C$DW$40, DW_AT_decl_column(0x0d) - 540$C$DW$41 .dwtag DW_TAG_member - 541 .dwattr $C$DW$41, DW_AT_type(*$C$DW$T$11) - 542 .dwattr $C$DW$41, DW_AT_name("INTC_CLK_EN") - 543 .dwattr $C$DW$41, DW_AT_TI_symbol_name("INTC_CLK_EN") - 544 .dwattr $C$DW$41, DW_AT_bit_offset(0x17), DW_AT_bit_size(0x01) - 545 .dwattr $C$DW$41, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 546 .dwattr $C$DW$41, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 547 .dwattr $C$DW$41, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 548 .dwattr $C$DW$41, DW_AT_decl_line(0x73) - 549 .dwattr $C$DW$41, DW_AT_decl_column(0x0d) - 550$C$DW$42 .dwtag DW_TAG_member -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 11 - - 551 .dwattr $C$DW$42, DW_AT_type(*$C$DW$T$11) - 552 .dwattr $C$DW$42, DW_AT_name("UART_CLK_STOP_REQ") - 553 .dwattr $C$DW$42, DW_AT_TI_symbol_name("UART_CLK_STOP_REQ") - 554 .dwattr $C$DW$42, DW_AT_bit_offset(0x16), DW_AT_bit_size(0x01) - 555 .dwattr $C$DW$42, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 556 .dwattr $C$DW$42, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 557 .dwattr $C$DW$42, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 558 .dwattr $C$DW$42, DW_AT_decl_line(0x74) - 559 .dwattr $C$DW$42, DW_AT_decl_column(0x0d) - 560$C$DW$43 .dwtag DW_TAG_member - 561 .dwattr $C$DW$43, DW_AT_type(*$C$DW$T$11) - 562 .dwattr $C$DW$43, DW_AT_name("UART_CLK_STOP_ACK") - 563 .dwattr $C$DW$43, DW_AT_TI_symbol_name("UART_CLK_STOP_ACK") - 564 .dwattr $C$DW$43, DW_AT_bit_offset(0x15), DW_AT_bit_size(0x01) - 565 .dwattr $C$DW$43, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 566 .dwattr $C$DW$43, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 567 .dwattr $C$DW$43, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 568 .dwattr $C$DW$43, DW_AT_decl_line(0x75) - 569 .dwattr $C$DW$43, DW_AT_decl_column(0x0d) - 570$C$DW$44 .dwtag DW_TAG_member - 571 .dwattr $C$DW$44, DW_AT_type(*$C$DW$T$11) - 572 .dwattr $C$DW$44, DW_AT_name("UART_CLK_EN") - 573 .dwattr $C$DW$44, DW_AT_TI_symbol_name("UART_CLK_EN") - 574 .dwattr $C$DW$44, DW_AT_bit_offset(0x14), DW_AT_bit_size(0x01) - 575 .dwattr $C$DW$44, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 576 .dwattr $C$DW$44, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 577 .dwattr $C$DW$44, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 578 .dwattr $C$DW$44, DW_AT_decl_line(0x76) - 579 .dwattr $C$DW$44, DW_AT_decl_column(0x0d) - 580$C$DW$45 .dwtag DW_TAG_member - 581 .dwattr $C$DW$45, DW_AT_type(*$C$DW$T$11) - 582 .dwattr $C$DW$45, DW_AT_name("ECAP_CLK_STOP_REQ") - 583 .dwattr $C$DW$45, DW_AT_TI_symbol_name("ECAP_CLK_STOP_REQ") - 584 .dwattr $C$DW$45, DW_AT_bit_offset(0x13), DW_AT_bit_size(0x01) - 585 .dwattr $C$DW$45, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 586 .dwattr $C$DW$45, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 587 .dwattr $C$DW$45, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 588 .dwattr $C$DW$45, DW_AT_decl_line(0x77) - 589 .dwattr $C$DW$45, DW_AT_decl_column(0x0d) - 590$C$DW$46 .dwtag DW_TAG_member - 591 .dwattr $C$DW$46, DW_AT_type(*$C$DW$T$11) - 592 .dwattr $C$DW$46, DW_AT_name("ECAP_CLK_STOP_ACK") - 593 .dwattr $C$DW$46, DW_AT_TI_symbol_name("ECAP_CLK_STOP_ACK") - 594 .dwattr $C$DW$46, DW_AT_bit_offset(0x12), DW_AT_bit_size(0x01) - 595 .dwattr $C$DW$46, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 596 .dwattr $C$DW$46, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 597 .dwattr $C$DW$46, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 598 .dwattr $C$DW$46, DW_AT_decl_line(0x78) - 599 .dwattr $C$DW$46, DW_AT_decl_column(0x0d) - 600$C$DW$47 .dwtag DW_TAG_member - 601 .dwattr $C$DW$47, DW_AT_type(*$C$DW$T$11) - 602 .dwattr $C$DW$47, DW_AT_name("ECAP_CLK_EN") - 603 .dwattr $C$DW$47, DW_AT_TI_symbol_name("ECAP_CLK_EN") - 604 .dwattr $C$DW$47, DW_AT_bit_offset(0x11), DW_AT_bit_size(0x01) - 605 .dwattr $C$DW$47, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 12 - - 606 .dwattr $C$DW$47, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 607 .dwattr $C$DW$47, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 608 .dwattr $C$DW$47, DW_AT_decl_line(0x79) - 609 .dwattr $C$DW$47, DW_AT_decl_column(0x0d) - 610$C$DW$48 .dwtag DW_TAG_member - 611 .dwattr $C$DW$48, DW_AT_type(*$C$DW$T$11) - 612 .dwattr $C$DW$48, DW_AT_name("IEP_CLK_STOP_REQ") - 613 .dwattr $C$DW$48, DW_AT_TI_symbol_name("IEP_CLK_STOP_REQ") - 614 .dwattr $C$DW$48, DW_AT_bit_offset(0x10), DW_AT_bit_size(0x01) - 615 .dwattr $C$DW$48, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 616 .dwattr $C$DW$48, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 617 .dwattr $C$DW$48, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 618 .dwattr $C$DW$48, DW_AT_decl_line(0x7a) - 619 .dwattr $C$DW$48, DW_AT_decl_column(0x0d) - 620$C$DW$49 .dwtag DW_TAG_member - 621 .dwattr $C$DW$49, DW_AT_type(*$C$DW$T$11) - 622 .dwattr $C$DW$49, DW_AT_name("IEP_CLK_STOP_ACK") - 623 .dwattr $C$DW$49, DW_AT_TI_symbol_name("IEP_CLK_STOP_ACK") - 624 .dwattr $C$DW$49, DW_AT_bit_offset(0x0f), DW_AT_bit_size(0x01) - 625 .dwattr $C$DW$49, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 626 .dwattr $C$DW$49, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 627 .dwattr $C$DW$49, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 628 .dwattr $C$DW$49, DW_AT_decl_line(0x7b) - 629 .dwattr $C$DW$49, DW_AT_decl_column(0x0d) - 630$C$DW$50 .dwtag DW_TAG_member - 631 .dwattr $C$DW$50, DW_AT_type(*$C$DW$T$11) - 632 .dwattr $C$DW$50, DW_AT_name("IEP_CLK_EN") - 633 .dwattr $C$DW$50, DW_AT_TI_symbol_name("IEP_CLK_EN") - 634 .dwattr $C$DW$50, DW_AT_bit_offset(0x0e), DW_AT_bit_size(0x01) - 635 .dwattr $C$DW$50, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 636 .dwattr $C$DW$50, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 637 .dwattr $C$DW$50, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 638 .dwattr $C$DW$50, DW_AT_decl_line(0x7c) - 639 .dwattr $C$DW$50, DW_AT_decl_column(0x0d) - 640$C$DW$51 .dwtag DW_TAG_member - 641 .dwattr $C$DW$51, DW_AT_type(*$C$DW$T$11) - 642 .dwattr $C$DW$51, DW_AT_name("rsvd18") - 643 .dwattr $C$DW$51, DW_AT_TI_symbol_name("rsvd18") - 644 .dwattr $C$DW$51, DW_AT_bit_offset(0x00), DW_AT_bit_size(0x0e) - 645 .dwattr $C$DW$51, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 646 .dwattr $C$DW$51, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 647 .dwattr $C$DW$51, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 648 .dwattr $C$DW$51, DW_AT_decl_line(0x7d) - 649 .dwattr $C$DW$51, DW_AT_decl_column(0x0d) - 650 .dwendtag $C$DW$T$23 - 651 - 652 .dwattr $C$DW$T$23, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 653 .dwattr $C$DW$T$23, DW_AT_decl_line(0x6a) - 654 .dwattr $C$DW$T$23, DW_AT_decl_column(0x13) - 655$C$DW$T$56 .dwtag DW_TAG_volatile_type - 656 .dwattr $C$DW$T$56, DW_AT_type(*$C$DW$T$23) - 657 - 658$C$DW$T$24 .dwtag DW_TAG_structure_type - 659 .dwattr $C$DW$T$24, DW_AT_byte_size(0x04) - 660$C$DW$52 .dwtag DW_TAG_member -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 13 - - 661 .dwattr $C$DW$52, DW_AT_type(*$C$DW$T$11) - 662 .dwattr $C$DW$52, DW_AT_name("PRU0_IMEM_PE_RAW") - 663 .dwattr $C$DW$52, DW_AT_TI_symbol_name("PRU0_IMEM_PE_RAW") - 664 .dwattr $C$DW$52, DW_AT_bit_offset(0x1c), DW_AT_bit_size(0x04) - 665 .dwattr $C$DW$52, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 666 .dwattr $C$DW$52, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 667 .dwattr $C$DW$52, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 668 .dwattr $C$DW$52, DW_AT_decl_line(0x87) - 669 .dwattr $C$DW$52, DW_AT_decl_column(0x0d) - 670$C$DW$53 .dwtag DW_TAG_member - 671 .dwattr $C$DW$53, DW_AT_type(*$C$DW$T$11) - 672 .dwattr $C$DW$53, DW_AT_name("PRU0_DMEM_PE_RAW") - 673 .dwattr $C$DW$53, DW_AT_TI_symbol_name("PRU0_DMEM_PE_RAW") - 674 .dwattr $C$DW$53, DW_AT_bit_offset(0x18), DW_AT_bit_size(0x04) - 675 .dwattr $C$DW$53, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 676 .dwattr $C$DW$53, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 677 .dwattr $C$DW$53, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 678 .dwattr $C$DW$53, DW_AT_decl_line(0x88) - 679 .dwattr $C$DW$53, DW_AT_decl_column(0x0d) - 680$C$DW$54 .dwtag DW_TAG_member - 681 .dwattr $C$DW$54, DW_AT_type(*$C$DW$T$11) - 682 .dwattr $C$DW$54, DW_AT_name("PRU1_IMEM_PE_RAW") - 683 .dwattr $C$DW$54, DW_AT_TI_symbol_name("PRU1_IMEM_PE_RAW") - 684 .dwattr $C$DW$54, DW_AT_bit_offset(0x14), DW_AT_bit_size(0x04) - 685 .dwattr $C$DW$54, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 686 .dwattr $C$DW$54, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 687 .dwattr $C$DW$54, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 688 .dwattr $C$DW$54, DW_AT_decl_line(0x89) - 689 .dwattr $C$DW$54, DW_AT_decl_column(0x0d) - 690$C$DW$55 .dwtag DW_TAG_member - 691 .dwattr $C$DW$55, DW_AT_type(*$C$DW$T$11) - 692 .dwattr $C$DW$55, DW_AT_name("PRU1_DMEM_PE_RAW") - 693 .dwattr $C$DW$55, DW_AT_TI_symbol_name("PRU1_DMEM_PE_RAW") - 694 .dwattr $C$DW$55, DW_AT_bit_offset(0x10), DW_AT_bit_size(0x04) - 695 .dwattr $C$DW$55, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 696 .dwattr $C$DW$55, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 697 .dwattr $C$DW$55, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 698 .dwattr $C$DW$55, DW_AT_decl_line(0x8a) - 699 .dwattr $C$DW$55, DW_AT_decl_column(0x0d) - 700$C$DW$56 .dwtag DW_TAG_member - 701 .dwattr $C$DW$56, DW_AT_type(*$C$DW$T$11) - 702 .dwattr $C$DW$56, DW_AT_name("RAM_PE_RAW") - 703 .dwattr $C$DW$56, DW_AT_TI_symbol_name("RAM_PE_RAW") - 704 .dwattr $C$DW$56, DW_AT_bit_offset(0x0c), DW_AT_bit_size(0x04) - 705 .dwattr $C$DW$56, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 706 .dwattr $C$DW$56, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 707 .dwattr $C$DW$56, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 708 .dwattr $C$DW$56, DW_AT_decl_line(0x8b) - 709 .dwattr $C$DW$56, DW_AT_decl_column(0x0d) - 710$C$DW$57 .dwtag DW_TAG_member - 711 .dwattr $C$DW$57, DW_AT_type(*$C$DW$T$11) - 712 .dwattr $C$DW$57, DW_AT_name("rsvd20") - 713 .dwattr $C$DW$57, DW_AT_TI_symbol_name("rsvd20") - 714 .dwattr $C$DW$57, DW_AT_bit_offset(0x00), DW_AT_bit_size(0x0c) - 715 .dwattr $C$DW$57, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 14 - - 716 .dwattr $C$DW$57, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 717 .dwattr $C$DW$57, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 718 .dwattr $C$DW$57, DW_AT_decl_line(0x8c) - 719 .dwattr $C$DW$57, DW_AT_decl_column(0x0d) - 720 .dwendtag $C$DW$T$24 - 721 - 722 .dwattr $C$DW$T$24, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 723 .dwattr $C$DW$T$24, DW_AT_decl_line(0x86) - 724 .dwattr $C$DW$T$24, DW_AT_decl_column(0x14) - 725$C$DW$T$58 .dwtag DW_TAG_volatile_type - 726 .dwattr $C$DW$T$58, DW_AT_type(*$C$DW$T$24) - 727 - 728$C$DW$T$25 .dwtag DW_TAG_structure_type - 729 .dwattr $C$DW$T$25, DW_AT_byte_size(0x04) - 730$C$DW$58 .dwtag DW_TAG_member - 731 .dwattr $C$DW$58, DW_AT_type(*$C$DW$T$11) - 732 .dwattr $C$DW$58, DW_AT_name("PRU0_IMEM_PE") - 733 .dwattr $C$DW$58, DW_AT_TI_symbol_name("PRU0_IMEM_PE") - 734 .dwattr $C$DW$58, DW_AT_bit_offset(0x1c), DW_AT_bit_size(0x04) - 735 .dwattr $C$DW$58, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 736 .dwattr $C$DW$58, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 737 .dwattr $C$DW$58, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 738 .dwattr $C$DW$58, DW_AT_decl_line(0x96) - 739 .dwattr $C$DW$58, DW_AT_decl_column(0x0d) - 740$C$DW$59 .dwtag DW_TAG_member - 741 .dwattr $C$DW$59, DW_AT_type(*$C$DW$T$11) - 742 .dwattr $C$DW$59, DW_AT_name("PRU0_DMEM_PE") - 743 .dwattr $C$DW$59, DW_AT_TI_symbol_name("PRU0_DMEM_PE") - 744 .dwattr $C$DW$59, DW_AT_bit_offset(0x18), DW_AT_bit_size(0x04) - 745 .dwattr $C$DW$59, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 746 .dwattr $C$DW$59, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 747 .dwattr $C$DW$59, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 748 .dwattr $C$DW$59, DW_AT_decl_line(0x97) - 749 .dwattr $C$DW$59, DW_AT_decl_column(0x0d) - 750$C$DW$60 .dwtag DW_TAG_member - 751 .dwattr $C$DW$60, DW_AT_type(*$C$DW$T$11) - 752 .dwattr $C$DW$60, DW_AT_name("PRU1_IMEM_PE") - 753 .dwattr $C$DW$60, DW_AT_TI_symbol_name("PRU1_IMEM_PE") - 754 .dwattr $C$DW$60, DW_AT_bit_offset(0x14), DW_AT_bit_size(0x04) - 755 .dwattr $C$DW$60, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 756 .dwattr $C$DW$60, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 757 .dwattr $C$DW$60, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 758 .dwattr $C$DW$60, DW_AT_decl_line(0x98) - 759 .dwattr $C$DW$60, DW_AT_decl_column(0x0d) - 760$C$DW$61 .dwtag DW_TAG_member - 761 .dwattr $C$DW$61, DW_AT_type(*$C$DW$T$11) - 762 .dwattr $C$DW$61, DW_AT_name("PRU1_DMEM_PE") - 763 .dwattr $C$DW$61, DW_AT_TI_symbol_name("PRU1_DMEM_PE") - 764 .dwattr $C$DW$61, DW_AT_bit_offset(0x10), DW_AT_bit_size(0x04) - 765 .dwattr $C$DW$61, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 766 .dwattr $C$DW$61, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 767 .dwattr $C$DW$61, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 768 .dwattr $C$DW$61, DW_AT_decl_line(0x99) - 769 .dwattr $C$DW$61, DW_AT_decl_column(0x0d) - 770$C$DW$62 .dwtag DW_TAG_member -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 15 - - 771 .dwattr $C$DW$62, DW_AT_type(*$C$DW$T$11) - 772 .dwattr $C$DW$62, DW_AT_name("RAM_PE") - 773 .dwattr $C$DW$62, DW_AT_TI_symbol_name("RAM_PE") - 774 .dwattr $C$DW$62, DW_AT_bit_offset(0x0c), DW_AT_bit_size(0x04) - 775 .dwattr $C$DW$62, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 776 .dwattr $C$DW$62, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 777 .dwattr $C$DW$62, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 778 .dwattr $C$DW$62, DW_AT_decl_line(0x9a) - 779 .dwattr $C$DW$62, DW_AT_decl_column(0x0d) - 780$C$DW$63 .dwtag DW_TAG_member - 781 .dwattr $C$DW$63, DW_AT_type(*$C$DW$T$11) - 782 .dwattr $C$DW$63, DW_AT_name("rsvd20") - 783 .dwattr $C$DW$63, DW_AT_TI_symbol_name("rsvd20") - 784 .dwattr $C$DW$63, DW_AT_bit_offset(0x00), DW_AT_bit_size(0x0c) - 785 .dwattr $C$DW$63, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 786 .dwattr $C$DW$63, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 787 .dwattr $C$DW$63, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 788 .dwattr $C$DW$63, DW_AT_decl_line(0x9b) - 789 .dwattr $C$DW$63, DW_AT_decl_column(0x0d) - 790 .dwendtag $C$DW$T$25 - 791 - 792 .dwattr $C$DW$T$25, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 793 .dwattr $C$DW$T$25, DW_AT_decl_line(0x95) - 794 .dwattr $C$DW$T$25, DW_AT_decl_column(0x14) - 795$C$DW$T$60 .dwtag DW_TAG_volatile_type - 796 .dwattr $C$DW$T$60, DW_AT_type(*$C$DW$T$25) - 797 - 798$C$DW$T$26 .dwtag DW_TAG_structure_type - 799 .dwattr $C$DW$T$26, DW_AT_byte_size(0x04) - 800$C$DW$64 .dwtag DW_TAG_member - 801 .dwattr $C$DW$64, DW_AT_type(*$C$DW$T$11) - 802 .dwattr $C$DW$64, DW_AT_name("PRU0_IMEM_PE_SET") - 803 .dwattr $C$DW$64, DW_AT_TI_symbol_name("PRU0_IMEM_PE_SET") - 804 .dwattr $C$DW$64, DW_AT_bit_offset(0x1c), DW_AT_bit_size(0x04) - 805 .dwattr $C$DW$64, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 806 .dwattr $C$DW$64, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 807 .dwattr $C$DW$64, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 808 .dwattr $C$DW$64, DW_AT_decl_line(0xa4) - 809 .dwattr $C$DW$64, DW_AT_decl_column(0x0d) - 810$C$DW$65 .dwtag DW_TAG_member - 811 .dwattr $C$DW$65, DW_AT_type(*$C$DW$T$11) - 812 .dwattr $C$DW$65, DW_AT_name("PRU0_DMEM_PE_SET") - 813 .dwattr $C$DW$65, DW_AT_TI_symbol_name("PRU0_DMEM_PE_SET") - 814 .dwattr $C$DW$65, DW_AT_bit_offset(0x18), DW_AT_bit_size(0x04) - 815 .dwattr $C$DW$65, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 816 .dwattr $C$DW$65, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 817 .dwattr $C$DW$65, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 818 .dwattr $C$DW$65, DW_AT_decl_line(0xa5) - 819 .dwattr $C$DW$65, DW_AT_decl_column(0x0d) - 820$C$DW$66 .dwtag DW_TAG_member - 821 .dwattr $C$DW$66, DW_AT_type(*$C$DW$T$11) - 822 .dwattr $C$DW$66, DW_AT_name("PRU1_IMEM_PE_SET") - 823 .dwattr $C$DW$66, DW_AT_TI_symbol_name("PRU1_IMEM_PE_SET") - 824 .dwattr $C$DW$66, DW_AT_bit_offset(0x14), DW_AT_bit_size(0x04) - 825 .dwattr $C$DW$66, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 16 - - 826 .dwattr $C$DW$66, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 827 .dwattr $C$DW$66, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 828 .dwattr $C$DW$66, DW_AT_decl_line(0xa6) - 829 .dwattr $C$DW$66, DW_AT_decl_column(0x0d) - 830$C$DW$67 .dwtag DW_TAG_member - 831 .dwattr $C$DW$67, DW_AT_type(*$C$DW$T$11) - 832 .dwattr $C$DW$67, DW_AT_name("PRU1_DMEM_PE_SET") - 833 .dwattr $C$DW$67, DW_AT_TI_symbol_name("PRU1_DMEM_PE_SET") - 834 .dwattr $C$DW$67, DW_AT_bit_offset(0x10), DW_AT_bit_size(0x04) - 835 .dwattr $C$DW$67, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 836 .dwattr $C$DW$67, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 837 .dwattr $C$DW$67, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 838 .dwattr $C$DW$67, DW_AT_decl_line(0xa7) - 839 .dwattr $C$DW$67, DW_AT_decl_column(0x0d) - 840$C$DW$68 .dwtag DW_TAG_member - 841 .dwattr $C$DW$68, DW_AT_type(*$C$DW$T$11) - 842 .dwattr $C$DW$68, DW_AT_name("RAM_PE_SET") - 843 .dwattr $C$DW$68, DW_AT_TI_symbol_name("RAM_PE_SET") - 844 .dwattr $C$DW$68, DW_AT_bit_offset(0x0c), DW_AT_bit_size(0x04) - 845 .dwattr $C$DW$68, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 846 .dwattr $C$DW$68, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 847 .dwattr $C$DW$68, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 848 .dwattr $C$DW$68, DW_AT_decl_line(0xa8) - 849 .dwattr $C$DW$68, DW_AT_decl_column(0x0d) - 850$C$DW$69 .dwtag DW_TAG_member - 851 .dwattr $C$DW$69, DW_AT_type(*$C$DW$T$11) - 852 .dwattr $C$DW$69, DW_AT_name("rsvd20") - 853 .dwattr $C$DW$69, DW_AT_TI_symbol_name("rsvd20") - 854 .dwattr $C$DW$69, DW_AT_bit_offset(0x00), DW_AT_bit_size(0x0c) - 855 .dwattr $C$DW$69, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 856 .dwattr $C$DW$69, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 857 .dwattr $C$DW$69, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 858 .dwattr $C$DW$69, DW_AT_decl_line(0xa9) - 859 .dwattr $C$DW$69, DW_AT_decl_column(0x0d) - 860 .dwendtag $C$DW$T$26 - 861 - 862 .dwattr $C$DW$T$26, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 863 .dwattr $C$DW$T$26, DW_AT_decl_line(0xa3) - 864 .dwattr $C$DW$T$26, DW_AT_decl_column(0x13) - 865$C$DW$T$62 .dwtag DW_TAG_volatile_type - 866 .dwattr $C$DW$T$62, DW_AT_type(*$C$DW$T$26) - 867 - 868$C$DW$T$27 .dwtag DW_TAG_structure_type - 869 .dwattr $C$DW$T$27, DW_AT_byte_size(0x04) - 870$C$DW$70 .dwtag DW_TAG_member - 871 .dwattr $C$DW$70, DW_AT_type(*$C$DW$T$11) - 872 .dwattr $C$DW$70, DW_AT_name("PRU0_IMEM_PE_CLR") - 873 .dwattr $C$DW$70, DW_AT_TI_symbol_name("PRU0_IMEM_PE_CLR") - 874 .dwattr $C$DW$70, DW_AT_bit_offset(0x1c), DW_AT_bit_size(0x04) - 875 .dwattr $C$DW$70, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 876 .dwattr $C$DW$70, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 877 .dwattr $C$DW$70, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 878 .dwattr $C$DW$70, DW_AT_decl_line(0xb3) - 879 .dwattr $C$DW$70, DW_AT_decl_column(0x0d) - 880$C$DW$71 .dwtag DW_TAG_member -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 17 - - 881 .dwattr $C$DW$71, DW_AT_type(*$C$DW$T$11) - 882 .dwattr $C$DW$71, DW_AT_name("PRU0_DMEM_PE_CLR") - 883 .dwattr $C$DW$71, DW_AT_TI_symbol_name("PRU0_DMEM_PE_CLR") - 884 .dwattr $C$DW$71, DW_AT_bit_offset(0x18), DW_AT_bit_size(0x04) - 885 .dwattr $C$DW$71, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 886 .dwattr $C$DW$71, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 887 .dwattr $C$DW$71, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 888 .dwattr $C$DW$71, DW_AT_decl_line(0xb4) - 889 .dwattr $C$DW$71, DW_AT_decl_column(0x0d) - 890$C$DW$72 .dwtag DW_TAG_member - 891 .dwattr $C$DW$72, DW_AT_type(*$C$DW$T$11) - 892 .dwattr $C$DW$72, DW_AT_name("PRU1_IMEM_PE_CLR") - 893 .dwattr $C$DW$72, DW_AT_TI_symbol_name("PRU1_IMEM_PE_CLR") - 894 .dwattr $C$DW$72, DW_AT_bit_offset(0x14), DW_AT_bit_size(0x04) - 895 .dwattr $C$DW$72, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 896 .dwattr $C$DW$72, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 897 .dwattr $C$DW$72, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 898 .dwattr $C$DW$72, DW_AT_decl_line(0xb5) - 899 .dwattr $C$DW$72, DW_AT_decl_column(0x0d) - 900$C$DW$73 .dwtag DW_TAG_member - 901 .dwattr $C$DW$73, DW_AT_type(*$C$DW$T$11) - 902 .dwattr $C$DW$73, DW_AT_name("PRU1_DMEM_PE_CLR") - 903 .dwattr $C$DW$73, DW_AT_TI_symbol_name("PRU1_DMEM_PE_CLR") - 904 .dwattr $C$DW$73, DW_AT_bit_offset(0x10), DW_AT_bit_size(0x04) - 905 .dwattr $C$DW$73, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 906 .dwattr $C$DW$73, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 907 .dwattr $C$DW$73, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 908 .dwattr $C$DW$73, DW_AT_decl_line(0xb6) - 909 .dwattr $C$DW$73, DW_AT_decl_column(0x0d) - 910$C$DW$74 .dwtag DW_TAG_member - 911 .dwattr $C$DW$74, DW_AT_type(*$C$DW$T$11) - 912 .dwattr $C$DW$74, DW_AT_name("rsvd16") - 913 .dwattr $C$DW$74, DW_AT_TI_symbol_name("rsvd16") - 914 .dwattr $C$DW$74, DW_AT_bit_offset(0x00), DW_AT_bit_size(0x10) - 915 .dwattr $C$DW$74, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 916 .dwattr $C$DW$74, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 917 .dwattr $C$DW$74, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 918 .dwattr $C$DW$74, DW_AT_decl_line(0xb7) - 919 .dwattr $C$DW$74, DW_AT_decl_column(0x0d) - 920 .dwendtag $C$DW$T$27 - 921 - 922 .dwattr $C$DW$T$27, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 923 .dwattr $C$DW$T$27, DW_AT_decl_line(0xb2) - 924 .dwattr $C$DW$T$27, DW_AT_decl_column(0x13) - 925$C$DW$T$64 .dwtag DW_TAG_volatile_type - 926 .dwattr $C$DW$T$64, DW_AT_type(*$C$DW$T$27) - 927 - 928$C$DW$T$28 .dwtag DW_TAG_structure_type - 929 .dwattr $C$DW$T$28, DW_AT_byte_size(0x04) - 930$C$DW$75 .dwtag DW_TAG_member - 931 .dwattr $C$DW$75, DW_AT_type(*$C$DW$T$11) - 932 .dwattr $C$DW$75, DW_AT_name("PMAO_PRU0") - 933 .dwattr $C$DW$75, DW_AT_TI_symbol_name("PMAO_PRU0") - 934 .dwattr $C$DW$75, DW_AT_bit_offset(0x1f), DW_AT_bit_size(0x01) - 935 .dwattr $C$DW$75, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 18 - - 936 .dwattr $C$DW$75, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 937 .dwattr $C$DW$75, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 938 .dwattr $C$DW$75, DW_AT_decl_line(0xc4) - 939 .dwattr $C$DW$75, DW_AT_decl_column(0x0d) - 940$C$DW$76 .dwtag DW_TAG_member - 941 .dwattr $C$DW$76, DW_AT_type(*$C$DW$T$11) - 942 .dwattr $C$DW$76, DW_AT_name("PMAO_PRU1") - 943 .dwattr $C$DW$76, DW_AT_TI_symbol_name("PMAO_PRU1") - 944 .dwattr $C$DW$76, DW_AT_bit_offset(0x1e), DW_AT_bit_size(0x01) - 945 .dwattr $C$DW$76, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 946 .dwattr $C$DW$76, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 947 .dwattr $C$DW$76, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 948 .dwattr $C$DW$76, DW_AT_decl_line(0xc5) - 949 .dwattr $C$DW$76, DW_AT_decl_column(0x0d) - 950$C$DW$77 .dwtag DW_TAG_member - 951 .dwattr $C$DW$77, DW_AT_type(*$C$DW$T$11) - 952 .dwattr $C$DW$77, DW_AT_name("rsvd2") - 953 .dwattr $C$DW$77, DW_AT_TI_symbol_name("rsvd2") - 954 .dwattr $C$DW$77, DW_AT_bit_offset(0x00), DW_AT_bit_size(0x1e) - 955 .dwattr $C$DW$77, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 956 .dwattr $C$DW$77, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 957 .dwattr $C$DW$77, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 958 .dwattr $C$DW$77, DW_AT_decl_line(0xc6) - 959 .dwattr $C$DW$77, DW_AT_decl_column(0x0d) - 960 .dwendtag $C$DW$T$28 - 961 - 962 .dwattr $C$DW$T$28, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 963 .dwattr $C$DW$T$28, DW_AT_decl_line(0xc3) - 964 .dwattr $C$DW$T$28, DW_AT_decl_column(0x13) - 965$C$DW$T$66 .dwtag DW_TAG_volatile_type - 966 .dwattr $C$DW$T$66, DW_AT_type(*$C$DW$T$28) - 967 - 968$C$DW$T$29 .dwtag DW_TAG_structure_type - 969 .dwattr $C$DW$T$29, DW_AT_byte_size(0x04) - 970$C$DW$78 .dwtag DW_TAG_member - 971 .dwattr $C$DW$78, DW_AT_type(*$C$DW$T$11) - 972 .dwattr $C$DW$78, DW_AT_name("OCP_EN") - 973 .dwattr $C$DW$78, DW_AT_TI_symbol_name("OCP_EN") - 974 .dwattr $C$DW$78, DW_AT_bit_offset(0x1f), DW_AT_bit_size(0x01) - 975 .dwattr $C$DW$78, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 976 .dwattr $C$DW$78, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 977 .dwattr $C$DW$78, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 978 .dwattr $C$DW$78, DW_AT_decl_line(0xd3) - 979 .dwattr $C$DW$78, DW_AT_decl_column(0x0d) - 980$C$DW$79 .dwtag DW_TAG_member - 981 .dwattr $C$DW$79, DW_AT_type(*$C$DW$T$11) - 982 .dwattr $C$DW$79, DW_AT_name("rsvd1") - 983 .dwattr $C$DW$79, DW_AT_TI_symbol_name("rsvd1") - 984 .dwattr $C$DW$79, DW_AT_bit_offset(0x00), DW_AT_bit_size(0x1f) - 985 .dwattr $C$DW$79, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 986 .dwattr $C$DW$79, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 987 .dwattr $C$DW$79, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 988 .dwattr $C$DW$79, DW_AT_decl_line(0xd4) - 989 .dwattr $C$DW$79, DW_AT_decl_column(0x0d) - 990 .dwendtag $C$DW$T$29 -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 19 - - 991 - 992 .dwattr $C$DW$T$29, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 993 .dwattr $C$DW$T$29, DW_AT_decl_line(0xd2) - 994 .dwattr $C$DW$T$29, DW_AT_decl_column(0x13) - 995$C$DW$T$68 .dwtag DW_TAG_volatile_type - 996 .dwattr $C$DW$T$68, DW_AT_type(*$C$DW$T$29) - 997 - 998$C$DW$T$30 .dwtag DW_TAG_structure_type - 999 .dwattr $C$DW$T$30, DW_AT_byte_size(0x04) - 1000$C$DW$80 .dwtag DW_TAG_member - 1001 .dwattr $C$DW$80, DW_AT_type(*$C$DW$T$11) - 1002 .dwattr $C$DW$80, DW_AT_name("PRU1_PAD_HP_EN") - 1003 .dwattr $C$DW$80, DW_AT_TI_symbol_name("PRU1_PAD_HP_EN") - 1004 .dwattr $C$DW$80, DW_AT_bit_offset(0x1f), DW_AT_bit_size(0x01) - 1005 .dwattr $C$DW$80, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1006 .dwattr $C$DW$80, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1007 .dwattr $C$DW$80, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 1008 .dwattr $C$DW$80, DW_AT_decl_line(0xde) - 1009 .dwattr $C$DW$80, DW_AT_decl_column(0x0d) - 1010$C$DW$81 .dwtag DW_TAG_member - 1011 .dwattr $C$DW$81, DW_AT_type(*$C$DW$T$11) - 1012 .dwattr $C$DW$81, DW_AT_name("XFR_SHIFT_EN") - 1013 .dwattr $C$DW$81, DW_AT_TI_symbol_name("XFR_SHIFT_EN") - 1014 .dwattr $C$DW$81, DW_AT_bit_offset(0x1e), DW_AT_bit_size(0x01) - 1015 .dwattr $C$DW$81, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1016 .dwattr $C$DW$81, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1017 .dwattr $C$DW$81, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 1018 .dwattr $C$DW$81, DW_AT_decl_line(0xdf) - 1019 .dwattr $C$DW$81, DW_AT_decl_column(0x0d) - 1020$C$DW$82 .dwtag DW_TAG_member - 1021 .dwattr $C$DW$82, DW_AT_type(*$C$DW$T$11) - 1022 .dwattr $C$DW$82, DW_AT_name("rsvd2") - 1023 .dwattr $C$DW$82, DW_AT_TI_symbol_name("rsvd2") - 1024 .dwattr $C$DW$82, DW_AT_bit_offset(0x00), DW_AT_bit_size(0x1e) - 1025 .dwattr $C$DW$82, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1026 .dwattr $C$DW$82, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1027 .dwattr $C$DW$82, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 1028 .dwattr $C$DW$82, DW_AT_decl_line(0xe0) - 1029 .dwattr $C$DW$82, DW_AT_decl_column(0x0d) - 1030 .dwendtag $C$DW$T$30 - 1031 - 1032 .dwattr $C$DW$T$30, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1033 .dwattr $C$DW$T$30, DW_AT_decl_line(0xdd) - 1034 .dwattr $C$DW$T$30, DW_AT_decl_column(0x13) - 1035$C$DW$T$70 .dwtag DW_TAG_volatile_type - 1036 .dwattr $C$DW$T$70, DW_AT_type(*$C$DW$T$30) - 1037 - 1038$C$DW$T$31 .dwtag DW_TAG_structure_type - 1039 .dwattr $C$DW$T$31, DW_AT_byte_size(0x04) - 1040$C$DW$83 .dwtag DW_TAG_member - 1041 .dwattr $C$DW$83, DW_AT_type(*$C$DW$T$11) - 1042 .dwattr $C$DW$83, DW_AT_name("PIN_MUX_SEL") - 1043 .dwattr $C$DW$83, DW_AT_TI_symbol_name("PIN_MUX_SEL") - 1044 .dwattr $C$DW$83, DW_AT_bit_offset(0x18), DW_AT_bit_size(0x08) - 1045 .dwattr $C$DW$83, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 20 - - 1046 .dwattr $C$DW$83, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1047 .dwattr $C$DW$83, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 1048 .dwattr $C$DW$83, DW_AT_decl_line(0xec) - 1049 .dwattr $C$DW$83, DW_AT_decl_column(0x0d) - 1050$C$DW$84 .dwtag DW_TAG_member - 1051 .dwattr $C$DW$84, DW_AT_type(*$C$DW$T$11) - 1052 .dwattr $C$DW$84, DW_AT_name("rsvd2") - 1053 .dwattr $C$DW$84, DW_AT_TI_symbol_name("rsvd2") - 1054 .dwattr $C$DW$84, DW_AT_bit_offset(0x00), DW_AT_bit_size(0x18) - 1055 .dwattr $C$DW$84, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1056 .dwattr $C$DW$84, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1057 .dwattr $C$DW$84, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 1058 .dwattr $C$DW$84, DW_AT_decl_line(0xed) - 1059 .dwattr $C$DW$84, DW_AT_decl_column(0x0d) - 1060 .dwendtag $C$DW$T$31 - 1061 - 1062 .dwattr $C$DW$T$31, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1063 .dwattr $C$DW$T$31, DW_AT_decl_line(0xeb) - 1064 .dwattr $C$DW$T$31, DW_AT_decl_column(0x13) - 1065$C$DW$T$72 .dwtag DW_TAG_volatile_type - 1066 .dwattr $C$DW$T$72, DW_AT_type(*$C$DW$T$31) - 1067 - 1068$C$DW$T$35 .dwtag DW_TAG_structure_type - 1069 .dwattr $C$DW$T$35, DW_AT_byte_size(0x44) - 1070$C$DW$85 .dwtag DW_TAG_member - 1071 .dwattr $C$DW$85, DW_AT_type(*$C$DW$T$49) - 1072 .dwattr $C$DW$85, DW_AT_name("$P$T0") - 1073 .dwattr $C$DW$85, DW_AT_TI_symbol_name("$P$T0") - 1074 .dwattr $C$DW$85, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1075 .dwattr $C$DW$85, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1076 .dwattr $C$DW$85, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 1077 .dwattr $C$DW$85, DW_AT_decl_line(0x29) - 1078 .dwattr $C$DW$85, DW_AT_decl_column(0x02) - 1079$C$DW$86 .dwtag DW_TAG_member - 1080 .dwattr $C$DW$86, DW_AT_type(*$C$DW$T$51) - 1081 .dwattr $C$DW$86, DW_AT_name("$P$T1") - 1082 .dwattr $C$DW$86, DW_AT_TI_symbol_name("$P$T1") - 1083 .dwattr $C$DW$86, DW_AT_data_member_location[DW_OP_plus_uconst 0x4] - 1084 .dwattr $C$DW$86, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1085 .dwattr $C$DW$86, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 1086 .dwattr $C$DW$86, DW_AT_decl_line(0x33) - 1087 .dwattr $C$DW$86, DW_AT_decl_column(0x02) - 1088$C$DW$87 .dwtag DW_TAG_member - 1089 .dwattr $C$DW$87, DW_AT_type(*$C$DW$T$53) - 1090 .dwattr $C$DW$87, DW_AT_name("$P$T2") - 1091 .dwattr $C$DW$87, DW_AT_TI_symbol_name("$P$T2") - 1092 .dwattr $C$DW$87, DW_AT_data_member_location[DW_OP_plus_uconst 0x8] - 1093 .dwattr $C$DW$87, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1094 .dwattr $C$DW$87, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 1095 .dwattr $C$DW$87, DW_AT_decl_line(0x41) - 1096 .dwattr $C$DW$87, DW_AT_decl_column(0x02) - 1097$C$DW$88 .dwtag DW_TAG_member - 1098 .dwattr $C$DW$88, DW_AT_type(*$C$DW$T$55) - 1099 .dwattr $C$DW$88, DW_AT_name("$P$T3") - 1100 .dwattr $C$DW$88, DW_AT_TI_symbol_name("$P$T3") -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 21 - - 1101 .dwattr $C$DW$88, DW_AT_data_member_location[DW_OP_plus_uconst 0xc] - 1102 .dwattr $C$DW$88, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1103 .dwattr $C$DW$88, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 1104 .dwattr $C$DW$88, DW_AT_decl_line(0x54) - 1105 .dwattr $C$DW$88, DW_AT_decl_column(0x02) - 1106$C$DW$89 .dwtag DW_TAG_member - 1107 .dwattr $C$DW$89, DW_AT_type(*$C$DW$T$57) - 1108 .dwattr $C$DW$89, DW_AT_name("$P$T4") - 1109 .dwattr $C$DW$89, DW_AT_TI_symbol_name("$P$T4") - 1110 .dwattr $C$DW$89, DW_AT_data_member_location[DW_OP_plus_uconst 0x10] - 1111 .dwattr $C$DW$89, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1112 .dwattr $C$DW$89, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 1113 .dwattr $C$DW$89, DW_AT_decl_line(0x67) - 1114 .dwattr $C$DW$89, DW_AT_decl_column(0x02) - 1115$C$DW$90 .dwtag DW_TAG_member - 1116 .dwattr $C$DW$90, DW_AT_type(*$C$DW$T$59) - 1117 .dwattr $C$DW$90, DW_AT_name("$P$T5") - 1118 .dwattr $C$DW$90, DW_AT_TI_symbol_name("$P$T5") - 1119 .dwattr $C$DW$90, DW_AT_data_member_location[DW_OP_plus_uconst 0x14] - 1120 .dwattr $C$DW$90, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1121 .dwattr $C$DW$90, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 1122 .dwattr $C$DW$90, DW_AT_decl_line(0x83) - 1123 .dwattr $C$DW$90, DW_AT_decl_column(0x02) - 1124$C$DW$91 .dwtag DW_TAG_member - 1125 .dwattr $C$DW$91, DW_AT_type(*$C$DW$T$61) - 1126 .dwattr $C$DW$91, DW_AT_name("$P$T6") - 1127 .dwattr $C$DW$91, DW_AT_TI_symbol_name("$P$T6") - 1128 .dwattr $C$DW$91, DW_AT_data_member_location[DW_OP_plus_uconst 0x18] - 1129 .dwattr $C$DW$91, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1130 .dwattr $C$DW$91, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 1131 .dwattr $C$DW$91, DW_AT_decl_line(0x92) - 1132 .dwattr $C$DW$91, DW_AT_decl_column(0x02) - 1133$C$DW$92 .dwtag DW_TAG_member - 1134 .dwattr $C$DW$92, DW_AT_type(*$C$DW$T$63) - 1135 .dwattr $C$DW$92, DW_AT_name("$P$T7") - 1136 .dwattr $C$DW$92, DW_AT_TI_symbol_name("$P$T7") - 1137 .dwattr $C$DW$92, DW_AT_data_member_location[DW_OP_plus_uconst 0x1c] - 1138 .dwattr $C$DW$92, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1139 .dwattr $C$DW$92, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 1140 .dwattr $C$DW$92, DW_AT_decl_line(0xa0) - 1141 .dwattr $C$DW$92, DW_AT_decl_column(0x02) - 1142$C$DW$93 .dwtag DW_TAG_member - 1143 .dwattr $C$DW$93, DW_AT_type(*$C$DW$T$65) - 1144 .dwattr $C$DW$93, DW_AT_name("$P$T8") - 1145 .dwattr $C$DW$93, DW_AT_TI_symbol_name("$P$T8") - 1146 .dwattr $C$DW$93, DW_AT_data_member_location[DW_OP_plus_uconst 0x20] - 1147 .dwattr $C$DW$93, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1148 .dwattr $C$DW$93, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 1149 .dwattr $C$DW$93, DW_AT_decl_line(0xaf) - 1150 .dwattr $C$DW$93, DW_AT_decl_column(0x02) - 1151$C$DW$94 .dwtag DW_TAG_member - 1152 .dwattr $C$DW$94, DW_AT_type(*$C$DW$T$32) - 1153 .dwattr $C$DW$94, DW_AT_name("rsvd24") - 1154 .dwattr $C$DW$94, DW_AT_TI_symbol_name("rsvd24") - 1155 .dwattr $C$DW$94, DW_AT_data_member_location[DW_OP_plus_uconst 0x24] -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 22 - - 1156 .dwattr $C$DW$94, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1157 .dwattr $C$DW$94, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 1158 .dwattr $C$DW$94, DW_AT_decl_line(0xbc) - 1159 .dwattr $C$DW$94, DW_AT_decl_column(0x0b) - 1160$C$DW$95 .dwtag DW_TAG_member - 1161 .dwattr $C$DW$95, DW_AT_type(*$C$DW$T$67) - 1162 .dwattr $C$DW$95, DW_AT_name("$P$T9") - 1163 .dwattr $C$DW$95, DW_AT_TI_symbol_name("$P$T9") - 1164 .dwattr $C$DW$95, DW_AT_data_member_location[DW_OP_plus_uconst 0x28] - 1165 .dwattr $C$DW$95, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1166 .dwattr $C$DW$95, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 1167 .dwattr $C$DW$95, DW_AT_decl_line(0xc0) - 1168 .dwattr $C$DW$95, DW_AT_decl_column(0x02) - 1169$C$DW$96 .dwtag DW_TAG_member - 1170 .dwattr $C$DW$96, DW_AT_type(*$C$DW$T$33) - 1171 .dwattr $C$DW$96, DW_AT_name("rsvd2c") - 1172 .dwattr $C$DW$96, DW_AT_TI_symbol_name("rsvd2c") - 1173 .dwattr $C$DW$96, DW_AT_data_member_location[DW_OP_plus_uconst 0x2c] - 1174 .dwattr $C$DW$96, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1175 .dwattr $C$DW$96, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 1176 .dwattr $C$DW$96, DW_AT_decl_line(0xcb) - 1177 .dwattr $C$DW$96, DW_AT_decl_column(0x0b) - 1178$C$DW$97 .dwtag DW_TAG_member - 1179 .dwattr $C$DW$97, DW_AT_type(*$C$DW$T$69) - 1180 .dwattr $C$DW$97, DW_AT_name("$P$T10") - 1181 .dwattr $C$DW$97, DW_AT_TI_symbol_name("$P$T10") - 1182 .dwattr $C$DW$97, DW_AT_data_member_location[DW_OP_plus_uconst 0x30] - 1183 .dwattr $C$DW$97, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1184 .dwattr $C$DW$97, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 1185 .dwattr $C$DW$97, DW_AT_decl_line(0xcf) - 1186 .dwattr $C$DW$97, DW_AT_decl_column(0x02) - 1187$C$DW$98 .dwtag DW_TAG_member - 1188 .dwattr $C$DW$98, DW_AT_type(*$C$DW$T$71) - 1189 .dwattr $C$DW$98, DW_AT_name("$P$T11") - 1190 .dwattr $C$DW$98, DW_AT_TI_symbol_name("$P$T11") - 1191 .dwattr $C$DW$98, DW_AT_data_member_location[DW_OP_plus_uconst 0x34] - 1192 .dwattr $C$DW$98, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1193 .dwattr $C$DW$98, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 1194 .dwattr $C$DW$98, DW_AT_decl_line(0xda) - 1195 .dwattr $C$DW$98, DW_AT_decl_column(0x02) - 1196$C$DW$99 .dwtag DW_TAG_member - 1197 .dwattr $C$DW$99, DW_AT_type(*$C$DW$T$34) - 1198 .dwattr $C$DW$99, DW_AT_name("rsvd38") - 1199 .dwattr $C$DW$99, DW_AT_TI_symbol_name("rsvd38") - 1200 .dwattr $C$DW$99, DW_AT_data_member_location[DW_OP_plus_uconst 0x38] - 1201 .dwattr $C$DW$99, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1202 .dwattr $C$DW$99, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pru - 1203 .dwattr $C$DW$99, DW_AT_decl_line(0xe5) - 1204 .dwattr $C$DW$99, DW_AT_decl_column(0x0b) - 1205$C$DW$100 .dwtag DW_TAG_member - 1206 .dwattr $C$DW$100, DW_AT_type(*$C$DW$T$73) - 1207 .dwattr $C$DW$100, DW_AT_name("$P$T12") - 1208 .dwattr $C$DW$100, DW_AT_TI_symbol_name("$P$T12") - 1209 .dwattr $C$DW$100, DW_AT_data_member_location[DW_OP_plus_uconst 0x40] - 1210 .dwattr $C$DW$100, DW_AT_accessibility(DW_ACCESS_ai_64_lic) -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 23 - - 1211 .dwattr $C$DW$100, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1212 .dwattr $C$DW$100, DW_AT_decl_line(0xe8) - 1213 .dwattr $C$DW$100, DW_AT_decl_column(0x02) - 1214 .dwendtag $C$DW$T$35 - 1215 - 1216 .dwattr $C$DW$T$35, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1217 .dwattr $C$DW$T$35, DW_AT_decl_line(0x26) - 1218 .dwattr $C$DW$T$35, DW_AT_decl_column(0x10) - 1219$C$DW$T$97 .dwtag DW_TAG_typedef, DW_AT_name("pruCfg") - 1220 .dwattr $C$DW$T$97, DW_AT_type(*$C$DW$T$35) - 1221 .dwattr $C$DW$T$97, DW_AT_language(DW_LANG_C) - 1222 .dwattr $C$DW$T$97, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1223 .dwattr $C$DW$T$97, DW_AT_decl_line(0xf0) - 1224 .dwattr $C$DW$T$97, DW_AT_decl_column(0x03) - 1225$C$DW$T$98 .dwtag DW_TAG_volatile_type - 1226 .dwattr $C$DW$T$98, DW_AT_type(*$C$DW$T$97) - 1227 - 1228$C$DW$T$36 .dwtag DW_TAG_structure_type - 1229 .dwattr $C$DW$T$36, DW_AT_byte_size(0x04) - 1230$C$DW$101 .dwtag DW_TAG_member - 1231 .dwattr $C$DW$101, DW_AT_type(*$C$DW$T$11) - 1232 .dwattr $C$DW$101, DW_AT_name("SOFT_RST_N") - 1233 .dwattr $C$DW$101, DW_AT_TI_symbol_name("SOFT_RST_N") - 1234 .dwattr $C$DW$101, DW_AT_bit_offset(0x1f), DW_AT_bit_size(0x01) - 1235 .dwattr $C$DW$101, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1236 .dwattr $C$DW$101, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1237 .dwattr $C$DW$101, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1238 .dwattr $C$DW$101, DW_AT_decl_line(0x2d) - 1239 .dwattr $C$DW$101, DW_AT_decl_column(0x0d) - 1240$C$DW$102 .dwtag DW_TAG_member - 1241 .dwattr $C$DW$102, DW_AT_type(*$C$DW$T$11) - 1242 .dwattr $C$DW$102, DW_AT_name("EN") - 1243 .dwattr $C$DW$102, DW_AT_TI_symbol_name("EN") - 1244 .dwattr $C$DW$102, DW_AT_bit_offset(0x1e), DW_AT_bit_size(0x01) - 1245 .dwattr $C$DW$102, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1246 .dwattr $C$DW$102, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1247 .dwattr $C$DW$102, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1248 .dwattr $C$DW$102, DW_AT_decl_line(0x2e) - 1249 .dwattr $C$DW$102, DW_AT_decl_column(0x0d) - 1250$C$DW$103 .dwtag DW_TAG_member - 1251 .dwattr $C$DW$103, DW_AT_type(*$C$DW$T$11) - 1252 .dwattr $C$DW$103, DW_AT_name("SLEEPING") - 1253 .dwattr $C$DW$103, DW_AT_TI_symbol_name("SLEEPING") - 1254 .dwattr $C$DW$103, DW_AT_bit_offset(0x1d), DW_AT_bit_size(0x01) - 1255 .dwattr $C$DW$103, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1256 .dwattr $C$DW$103, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1257 .dwattr $C$DW$103, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1258 .dwattr $C$DW$103, DW_AT_decl_line(0x2f) - 1259 .dwattr $C$DW$103, DW_AT_decl_column(0x0d) - 1260$C$DW$104 .dwtag DW_TAG_member - 1261 .dwattr $C$DW$104, DW_AT_type(*$C$DW$T$11) - 1262 .dwattr $C$DW$104, DW_AT_name("CTR_EN") - 1263 .dwattr $C$DW$104, DW_AT_TI_symbol_name("CTR_EN") - 1264 .dwattr $C$DW$104, DW_AT_bit_offset(0x1c), DW_AT_bit_size(0x01) - 1265 .dwattr $C$DW$104, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 24 - - 1266 .dwattr $C$DW$104, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1267 .dwattr $C$DW$104, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1268 .dwattr $C$DW$104, DW_AT_decl_line(0x30) - 1269 .dwattr $C$DW$104, DW_AT_decl_column(0x0d) - 1270$C$DW$105 .dwtag DW_TAG_member - 1271 .dwattr $C$DW$105, DW_AT_type(*$C$DW$T$11) - 1272 .dwattr $C$DW$105, DW_AT_name("rsvd4") - 1273 .dwattr $C$DW$105, DW_AT_TI_symbol_name("rsvd4") - 1274 .dwattr $C$DW$105, DW_AT_bit_offset(0x18), DW_AT_bit_size(0x04) - 1275 .dwattr $C$DW$105, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1276 .dwattr $C$DW$105, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1277 .dwattr $C$DW$105, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1278 .dwattr $C$DW$105, DW_AT_decl_line(0x31) - 1279 .dwattr $C$DW$105, DW_AT_decl_column(0x0d) - 1280$C$DW$106 .dwtag DW_TAG_member - 1281 .dwattr $C$DW$106, DW_AT_type(*$C$DW$T$11) - 1282 .dwattr $C$DW$106, DW_AT_name("SINGLE_STEP") - 1283 .dwattr $C$DW$106, DW_AT_TI_symbol_name("SINGLE_STEP") - 1284 .dwattr $C$DW$106, DW_AT_bit_offset(0x17), DW_AT_bit_size(0x01) - 1285 .dwattr $C$DW$106, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1286 .dwattr $C$DW$106, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1287 .dwattr $C$DW$106, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1288 .dwattr $C$DW$106, DW_AT_decl_line(0x32) - 1289 .dwattr $C$DW$106, DW_AT_decl_column(0x0d) - 1290$C$DW$107 .dwtag DW_TAG_member - 1291 .dwattr $C$DW$107, DW_AT_type(*$C$DW$T$11) - 1292 .dwattr $C$DW$107, DW_AT_name("rsvd9") - 1293 .dwattr $C$DW$107, DW_AT_TI_symbol_name("rsvd9") - 1294 .dwattr $C$DW$107, DW_AT_bit_offset(0x11), DW_AT_bit_size(0x06) - 1295 .dwattr $C$DW$107, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1296 .dwattr $C$DW$107, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1297 .dwattr $C$DW$107, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1298 .dwattr $C$DW$107, DW_AT_decl_line(0x33) - 1299 .dwattr $C$DW$107, DW_AT_decl_column(0x0d) - 1300$C$DW$108 .dwtag DW_TAG_member - 1301 .dwattr $C$DW$108, DW_AT_type(*$C$DW$T$11) - 1302 .dwattr $C$DW$108, DW_AT_name("RUNSTATE") - 1303 .dwattr $C$DW$108, DW_AT_TI_symbol_name("RUNSTATE") - 1304 .dwattr $C$DW$108, DW_AT_bit_offset(0x10), DW_AT_bit_size(0x01) - 1305 .dwattr $C$DW$108, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1306 .dwattr $C$DW$108, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1307 .dwattr $C$DW$108, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1308 .dwattr $C$DW$108, DW_AT_decl_line(0x34) - 1309 .dwattr $C$DW$108, DW_AT_decl_column(0x0d) - 1310$C$DW$109 .dwtag DW_TAG_member - 1311 .dwattr $C$DW$109, DW_AT_type(*$C$DW$T$11) - 1312 .dwattr $C$DW$109, DW_AT_name("PCTR_RST_VAL") - 1313 .dwattr $C$DW$109, DW_AT_TI_symbol_name("PCTR_RST_VAL") - 1314 .dwattr $C$DW$109, DW_AT_bit_offset(0x00), DW_AT_bit_size(0x10) - 1315 .dwattr $C$DW$109, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1316 .dwattr $C$DW$109, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1317 .dwattr $C$DW$109, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1318 .dwattr $C$DW$109, DW_AT_decl_line(0x35) - 1319 .dwattr $C$DW$109, DW_AT_decl_column(0x0d) - 1320 .dwendtag $C$DW$T$36 -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 25 - - 1321 - 1322 .dwattr $C$DW$T$36, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1323 .dwattr $C$DW$T$36, DW_AT_decl_line(0x2c) - 1324 .dwattr $C$DW$T$36, DW_AT_decl_column(0x13) - 1325$C$DW$T$74 .dwtag DW_TAG_volatile_type - 1326 .dwattr $C$DW$T$74, DW_AT_type(*$C$DW$T$36) - 1327 - 1328$C$DW$T$37 .dwtag DW_TAG_structure_type - 1329 .dwattr $C$DW$T$37, DW_AT_byte_size(0x04) - 1330$C$DW$110 .dwtag DW_TAG_member - 1331 .dwattr $C$DW$110, DW_AT_type(*$C$DW$T$11) - 1332 .dwattr $C$DW$110, DW_AT_name("PCTR") - 1333 .dwattr $C$DW$110, DW_AT_TI_symbol_name("PCTR") - 1334 .dwattr $C$DW$110, DW_AT_bit_offset(0x10), DW_AT_bit_size(0x10) - 1335 .dwattr $C$DW$110, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1336 .dwattr $C$DW$110, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1337 .dwattr $C$DW$110, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1338 .dwattr $C$DW$110, DW_AT_decl_line(0x3f) - 1339 .dwattr $C$DW$110, DW_AT_decl_column(0x0d) - 1340$C$DW$111 .dwtag DW_TAG_member - 1341 .dwattr $C$DW$111, DW_AT_type(*$C$DW$T$11) - 1342 .dwattr $C$DW$111, DW_AT_name("rsvd16") - 1343 .dwattr $C$DW$111, DW_AT_TI_symbol_name("rsvd16") - 1344 .dwattr $C$DW$111, DW_AT_bit_offset(0x00), DW_AT_bit_size(0x10) - 1345 .dwattr $C$DW$111, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1346 .dwattr $C$DW$111, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1347 .dwattr $C$DW$111, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1348 .dwattr $C$DW$111, DW_AT_decl_line(0x40) - 1349 .dwattr $C$DW$111, DW_AT_decl_column(0x0d) - 1350 .dwendtag $C$DW$T$37 - 1351 - 1352 .dwattr $C$DW$T$37, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1353 .dwattr $C$DW$T$37, DW_AT_decl_line(0x3e) - 1354 .dwattr $C$DW$T$37, DW_AT_decl_column(0x13) - 1355$C$DW$T$76 .dwtag DW_TAG_volatile_type - 1356 .dwattr $C$DW$T$76, DW_AT_type(*$C$DW$T$37) - 1357 - 1358$C$DW$T$38 .dwtag DW_TAG_structure_type - 1359 .dwattr $C$DW$T$38, DW_AT_byte_size(0x04) - 1360$C$DW$112 .dwtag DW_TAG_member - 1361 .dwattr $C$DW$112, DW_AT_type(*$C$DW$T$11) - 1362 .dwattr $C$DW$112, DW_AT_name("BITWISE_ENS") - 1363 .dwattr $C$DW$112, DW_AT_TI_symbol_name("BITWISE_ENS") - 1364 .dwattr $C$DW$112, DW_AT_bit_offset(0x00), DW_AT_bit_size(0x20) - 1365 .dwattr $C$DW$112, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1366 .dwattr $C$DW$112, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1367 .dwattr $C$DW$112, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1368 .dwattr $C$DW$112, DW_AT_decl_line(0x4a) - 1369 .dwattr $C$DW$112, DW_AT_decl_column(0x0d) - 1370 .dwendtag $C$DW$T$38 - 1371 - 1372 .dwattr $C$DW$T$38, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1373 .dwattr $C$DW$T$38, DW_AT_decl_line(0x49) - 1374 .dwattr $C$DW$T$38, DW_AT_decl_column(0x13) - 1375$C$DW$T$78 .dwtag DW_TAG_volatile_type -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 26 - - 1376 .dwattr $C$DW$T$78, DW_AT_type(*$C$DW$T$38) - 1377 - 1378$C$DW$T$39 .dwtag DW_TAG_structure_type - 1379 .dwattr $C$DW$T$39, DW_AT_byte_size(0x04) - 1380$C$DW$113 .dwtag DW_TAG_member - 1381 .dwattr $C$DW$113, DW_AT_type(*$C$DW$T$11) - 1382 .dwattr $C$DW$113, DW_AT_name("CYCLECOUNT") - 1383 .dwattr $C$DW$113, DW_AT_TI_symbol_name("CYCLECOUNT") - 1384 .dwattr $C$DW$113, DW_AT_bit_offset(0x00), DW_AT_bit_size(0x20) - 1385 .dwattr $C$DW$113, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1386 .dwattr $C$DW$113, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1387 .dwattr $C$DW$113, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1388 .dwattr $C$DW$113, DW_AT_decl_line(0x54) - 1389 .dwattr $C$DW$113, DW_AT_decl_column(0x0d) - 1390 .dwendtag $C$DW$T$39 - 1391 - 1392 .dwattr $C$DW$T$39, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1393 .dwattr $C$DW$T$39, DW_AT_decl_line(0x53) - 1394 .dwattr $C$DW$T$39, DW_AT_decl_column(0x13) - 1395$C$DW$T$80 .dwtag DW_TAG_volatile_type - 1396 .dwattr $C$DW$T$80, DW_AT_type(*$C$DW$T$39) - 1397 - 1398$C$DW$T$40 .dwtag DW_TAG_structure_type - 1399 .dwattr $C$DW$T$40, DW_AT_byte_size(0x04) - 1400$C$DW$114 .dwtag DW_TAG_member - 1401 .dwattr $C$DW$114, DW_AT_type(*$C$DW$T$11) - 1402 .dwattr $C$DW$114, DW_AT_name("STALLCOUNT") - 1403 .dwattr $C$DW$114, DW_AT_TI_symbol_name("STALLCOUNT") - 1404 .dwattr $C$DW$114, DW_AT_bit_offset(0x00), DW_AT_bit_size(0x20) - 1405 .dwattr $C$DW$114, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1406 .dwattr $C$DW$114, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1407 .dwattr $C$DW$114, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1408 .dwattr $C$DW$114, DW_AT_decl_line(0x5e) - 1409 .dwattr $C$DW$114, DW_AT_decl_column(0x0d) - 1410 .dwendtag $C$DW$T$40 - 1411 - 1412 .dwattr $C$DW$T$40, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1413 .dwattr $C$DW$T$40, DW_AT_decl_line(0x5d) - 1414 .dwattr $C$DW$T$40, DW_AT_decl_column(0x14) - 1415$C$DW$T$82 .dwtag DW_TAG_volatile_type - 1416 .dwattr $C$DW$T$82, DW_AT_type(*$C$DW$T$40) - 1417 - 1418$C$DW$T$41 .dwtag DW_TAG_structure_type - 1419 .dwattr $C$DW$T$41, DW_AT_byte_size(0x04) - 1420$C$DW$115 .dwtag DW_TAG_member - 1421 .dwattr $C$DW$115, DW_AT_type(*$C$DW$T$11) - 1422 .dwattr $C$DW$115, DW_AT_name("C24_BLK_IDX") - 1423 .dwattr $C$DW$115, DW_AT_TI_symbol_name("C24_BLK_IDX") - 1424 .dwattr $C$DW$115, DW_AT_bit_offset(0x18), DW_AT_bit_size(0x08) - 1425 .dwattr $C$DW$115, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1426 .dwattr $C$DW$115, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1427 .dwattr $C$DW$115, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1428 .dwattr $C$DW$115, DW_AT_decl_line(0x6b) - 1429 .dwattr $C$DW$115, DW_AT_decl_column(0x0d) - 1430$C$DW$116 .dwtag DW_TAG_member -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 27 - - 1431 .dwattr $C$DW$116, DW_AT_type(*$C$DW$T$11) - 1432 .dwattr $C$DW$116, DW_AT_name("rsvd8") - 1433 .dwattr $C$DW$116, DW_AT_TI_symbol_name("rsvd8") - 1434 .dwattr $C$DW$116, DW_AT_bit_offset(0x10), DW_AT_bit_size(0x08) - 1435 .dwattr $C$DW$116, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1436 .dwattr $C$DW$116, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1437 .dwattr $C$DW$116, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1438 .dwattr $C$DW$116, DW_AT_decl_line(0x6c) - 1439 .dwattr $C$DW$116, DW_AT_decl_column(0x0d) - 1440$C$DW$117 .dwtag DW_TAG_member - 1441 .dwattr $C$DW$117, DW_AT_type(*$C$DW$T$11) - 1442 .dwattr $C$DW$117, DW_AT_name("C25_BLK_IDX") - 1443 .dwattr $C$DW$117, DW_AT_TI_symbol_name("C25_BLK_IDX") - 1444 .dwattr $C$DW$117, DW_AT_bit_offset(0x08), DW_AT_bit_size(0x08) - 1445 .dwattr $C$DW$117, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1446 .dwattr $C$DW$117, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1447 .dwattr $C$DW$117, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1448 .dwattr $C$DW$117, DW_AT_decl_line(0x6d) - 1449 .dwattr $C$DW$117, DW_AT_decl_column(0x0d) - 1450$C$DW$118 .dwtag DW_TAG_member - 1451 .dwattr $C$DW$118, DW_AT_type(*$C$DW$T$11) - 1452 .dwattr $C$DW$118, DW_AT_name("rsvd24") - 1453 .dwattr $C$DW$118, DW_AT_TI_symbol_name("rsvd24") - 1454 .dwattr $C$DW$118, DW_AT_bit_offset(0x00), DW_AT_bit_size(0x08) - 1455 .dwattr $C$DW$118, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1456 .dwattr $C$DW$118, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1457 .dwattr $C$DW$118, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1458 .dwattr $C$DW$118, DW_AT_decl_line(0x6e) - 1459 .dwattr $C$DW$118, DW_AT_decl_column(0x0d) - 1460 .dwendtag $C$DW$T$41 - 1461 - 1462 .dwattr $C$DW$T$41, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1463 .dwattr $C$DW$T$41, DW_AT_decl_line(0x6a) - 1464 .dwattr $C$DW$T$41, DW_AT_decl_column(0x13) - 1465$C$DW$T$84 .dwtag DW_TAG_volatile_type - 1466 .dwattr $C$DW$T$84, DW_AT_type(*$C$DW$T$41) - 1467 - 1468$C$DW$T$42 .dwtag DW_TAG_structure_type - 1469 .dwattr $C$DW$T$42, DW_AT_byte_size(0x04) - 1470$C$DW$119 .dwtag DW_TAG_member - 1471 .dwattr $C$DW$119, DW_AT_type(*$C$DW$T$11) - 1472 .dwattr $C$DW$119, DW_AT_name("C26_BLK_IDX") - 1473 .dwattr $C$DW$119, DW_AT_TI_symbol_name("C26_BLK_IDX") - 1474 .dwattr $C$DW$119, DW_AT_bit_offset(0x18), DW_AT_bit_size(0x08) - 1475 .dwattr $C$DW$119, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1476 .dwattr $C$DW$119, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1477 .dwattr $C$DW$119, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1478 .dwattr $C$DW$119, DW_AT_decl_line(0x78) - 1479 .dwattr $C$DW$119, DW_AT_decl_column(0x0d) - 1480$C$DW$120 .dwtag DW_TAG_member - 1481 .dwattr $C$DW$120, DW_AT_type(*$C$DW$T$11) - 1482 .dwattr $C$DW$120, DW_AT_name("rsvd8") - 1483 .dwattr $C$DW$120, DW_AT_TI_symbol_name("rsvd8") - 1484 .dwattr $C$DW$120, DW_AT_bit_offset(0x10), DW_AT_bit_size(0x08) - 1485 .dwattr $C$DW$120, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 28 - - 1486 .dwattr $C$DW$120, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1487 .dwattr $C$DW$120, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1488 .dwattr $C$DW$120, DW_AT_decl_line(0x79) - 1489 .dwattr $C$DW$120, DW_AT_decl_column(0x0d) - 1490$C$DW$121 .dwtag DW_TAG_member - 1491 .dwattr $C$DW$121, DW_AT_type(*$C$DW$T$11) - 1492 .dwattr $C$DW$121, DW_AT_name("C27_BLK_IDX") - 1493 .dwattr $C$DW$121, DW_AT_TI_symbol_name("C27_BLK_IDX") - 1494 .dwattr $C$DW$121, DW_AT_bit_offset(0x08), DW_AT_bit_size(0x08) - 1495 .dwattr $C$DW$121, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1496 .dwattr $C$DW$121, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1497 .dwattr $C$DW$121, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1498 .dwattr $C$DW$121, DW_AT_decl_line(0x7a) - 1499 .dwattr $C$DW$121, DW_AT_decl_column(0x0d) - 1500$C$DW$122 .dwtag DW_TAG_member - 1501 .dwattr $C$DW$122, DW_AT_type(*$C$DW$T$11) - 1502 .dwattr $C$DW$122, DW_AT_name("rsvd24") - 1503 .dwattr $C$DW$122, DW_AT_TI_symbol_name("rsvd24") - 1504 .dwattr $C$DW$122, DW_AT_bit_offset(0x00), DW_AT_bit_size(0x08) - 1505 .dwattr $C$DW$122, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1506 .dwattr $C$DW$122, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1507 .dwattr $C$DW$122, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1508 .dwattr $C$DW$122, DW_AT_decl_line(0x7b) - 1509 .dwattr $C$DW$122, DW_AT_decl_column(0x0d) - 1510 .dwendtag $C$DW$T$42 - 1511 - 1512 .dwattr $C$DW$T$42, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1513 .dwattr $C$DW$T$42, DW_AT_decl_line(0x77) - 1514 .dwattr $C$DW$T$42, DW_AT_decl_column(0x13) - 1515$C$DW$T$86 .dwtag DW_TAG_volatile_type - 1516 .dwattr $C$DW$T$86, DW_AT_type(*$C$DW$T$42) - 1517 - 1518$C$DW$T$43 .dwtag DW_TAG_structure_type - 1519 .dwattr $C$DW$T$43, DW_AT_byte_size(0x04) - 1520$C$DW$123 .dwtag DW_TAG_member - 1521 .dwattr $C$DW$123, DW_AT_type(*$C$DW$T$11) - 1522 .dwattr $C$DW$123, DW_AT_name("C28_BLK_POINTER") - 1523 .dwattr $C$DW$123, DW_AT_TI_symbol_name("C28_BLK_POINTER") - 1524 .dwattr $C$DW$123, DW_AT_bit_offset(0x10), DW_AT_bit_size(0x10) - 1525 .dwattr $C$DW$123, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1526 .dwattr $C$DW$123, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1527 .dwattr $C$DW$123, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1528 .dwattr $C$DW$123, DW_AT_decl_line(0x85) - 1529 .dwattr $C$DW$123, DW_AT_decl_column(0x0d) - 1530$C$DW$124 .dwtag DW_TAG_member - 1531 .dwattr $C$DW$124, DW_AT_type(*$C$DW$T$11) - 1532 .dwattr $C$DW$124, DW_AT_name("C29_BLK_POINTER") - 1533 .dwattr $C$DW$124, DW_AT_TI_symbol_name("C29_BLK_POINTER") - 1534 .dwattr $C$DW$124, DW_AT_bit_offset(0x00), DW_AT_bit_size(0x10) - 1535 .dwattr $C$DW$124, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1536 .dwattr $C$DW$124, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1537 .dwattr $C$DW$124, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1538 .dwattr $C$DW$124, DW_AT_decl_line(0x86) - 1539 .dwattr $C$DW$124, DW_AT_decl_column(0x0d) - 1540 .dwendtag $C$DW$T$43 -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 29 - - 1541 - 1542 .dwattr $C$DW$T$43, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1543 .dwattr $C$DW$T$43, DW_AT_decl_line(0x84) - 1544 .dwattr $C$DW$T$43, DW_AT_decl_column(0x13) - 1545$C$DW$T$88 .dwtag DW_TAG_volatile_type - 1546 .dwattr $C$DW$T$88, DW_AT_type(*$C$DW$T$43) - 1547 - 1548$C$DW$T$44 .dwtag DW_TAG_structure_type - 1549 .dwattr $C$DW$T$44, DW_AT_byte_size(0x04) - 1550$C$DW$125 .dwtag DW_TAG_member - 1551 .dwattr $C$DW$125, DW_AT_type(*$C$DW$T$11) - 1552 .dwattr $C$DW$125, DW_AT_name("C30_BLK_POINTER") - 1553 .dwattr $C$DW$125, DW_AT_TI_symbol_name("C30_BLK_POINTER") - 1554 .dwattr $C$DW$125, DW_AT_bit_offset(0x10), DW_AT_bit_size(0x10) - 1555 .dwattr $C$DW$125, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1556 .dwattr $C$DW$125, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1557 .dwattr $C$DW$125, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1558 .dwattr $C$DW$125, DW_AT_decl_line(0x90) - 1559 .dwattr $C$DW$125, DW_AT_decl_column(0x0d) - 1560$C$DW$126 .dwtag DW_TAG_member - 1561 .dwattr $C$DW$126, DW_AT_type(*$C$DW$T$11) - 1562 .dwattr $C$DW$126, DW_AT_name("C31_BLK_POINTER") - 1563 .dwattr $C$DW$126, DW_AT_TI_symbol_name("C31_BLK_POINTER") - 1564 .dwattr $C$DW$126, DW_AT_bit_offset(0x00), DW_AT_bit_size(0x10) - 1565 .dwattr $C$DW$126, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1566 .dwattr $C$DW$126, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1567 .dwattr $C$DW$126, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1568 .dwattr $C$DW$126, DW_AT_decl_line(0x91) - 1569 .dwattr $C$DW$126, DW_AT_decl_column(0x0d) - 1570 .dwendtag $C$DW$T$44 - 1571 - 1572 .dwattr $C$DW$T$44, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1573 .dwattr $C$DW$T$44, DW_AT_decl_line(0x8f) - 1574 .dwattr $C$DW$T$44, DW_AT_decl_column(0x13) - 1575$C$DW$T$90 .dwtag DW_TAG_volatile_type - 1576 .dwattr $C$DW$T$90, DW_AT_type(*$C$DW$T$44) - 1577 - 1578$C$DW$T$46 .dwtag DW_TAG_structure_type - 1579 .dwattr $C$DW$T$46, DW_AT_byte_size(0x30) - 1580$C$DW$127 .dwtag DW_TAG_member - 1581 .dwattr $C$DW$127, DW_AT_type(*$C$DW$T$75) - 1582 .dwattr $C$DW$127, DW_AT_name("$P$T13") - 1583 .dwattr $C$DW$127, DW_AT_TI_symbol_name("$P$T13") - 1584 .dwattr $C$DW$127, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1585 .dwattr $C$DW$127, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1586 .dwattr $C$DW$127, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1587 .dwattr $C$DW$127, DW_AT_decl_line(0x29) - 1588 .dwattr $C$DW$127, DW_AT_decl_column(0x02) - 1589$C$DW$128 .dwtag DW_TAG_member - 1590 .dwattr $C$DW$128, DW_AT_type(*$C$DW$T$77) - 1591 .dwattr $C$DW$128, DW_AT_name("$P$T14") - 1592 .dwattr $C$DW$128, DW_AT_TI_symbol_name("$P$T14") - 1593 .dwattr $C$DW$128, DW_AT_data_member_location[DW_OP_plus_uconst 0x4] - 1594 .dwattr $C$DW$128, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1595 .dwattr $C$DW$128, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 30 - - 1596 .dwattr $C$DW$128, DW_AT_decl_line(0x3b) - 1597 .dwattr $C$DW$128, DW_AT_decl_column(0x02) - 1598$C$DW$129 .dwtag DW_TAG_member - 1599 .dwattr $C$DW$129, DW_AT_type(*$C$DW$T$79) - 1600 .dwattr $C$DW$129, DW_AT_name("$P$T15") - 1601 .dwattr $C$DW$129, DW_AT_TI_symbol_name("$P$T15") - 1602 .dwattr $C$DW$129, DW_AT_data_member_location[DW_OP_plus_uconst 0x8] - 1603 .dwattr $C$DW$129, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1604 .dwattr $C$DW$129, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1605 .dwattr $C$DW$129, DW_AT_decl_line(0x46) - 1606 .dwattr $C$DW$129, DW_AT_decl_column(0x02) - 1607$C$DW$130 .dwtag DW_TAG_member - 1608 .dwattr $C$DW$130, DW_AT_type(*$C$DW$T$81) - 1609 .dwattr $C$DW$130, DW_AT_name("$P$T16") - 1610 .dwattr $C$DW$130, DW_AT_TI_symbol_name("$P$T16") - 1611 .dwattr $C$DW$130, DW_AT_data_member_location[DW_OP_plus_uconst 0xc] - 1612 .dwattr $C$DW$130, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1613 .dwattr $C$DW$130, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1614 .dwattr $C$DW$130, DW_AT_decl_line(0x50) - 1615 .dwattr $C$DW$130, DW_AT_decl_column(0x02) - 1616$C$DW$131 .dwtag DW_TAG_member - 1617 .dwattr $C$DW$131, DW_AT_type(*$C$DW$T$83) - 1618 .dwattr $C$DW$131, DW_AT_name("$P$T17") - 1619 .dwattr $C$DW$131, DW_AT_TI_symbol_name("$P$T17") - 1620 .dwattr $C$DW$131, DW_AT_data_member_location[DW_OP_plus_uconst 0x10] - 1621 .dwattr $C$DW$131, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1622 .dwattr $C$DW$131, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1623 .dwattr $C$DW$131, DW_AT_decl_line(0x5a) - 1624 .dwattr $C$DW$131, DW_AT_decl_column(0x02) - 1625$C$DW$132 .dwtag DW_TAG_member - 1626 .dwattr $C$DW$132, DW_AT_type(*$C$DW$T$45) - 1627 .dwattr $C$DW$132, DW_AT_name("rsvd14") - 1628 .dwattr $C$DW$132, DW_AT_TI_symbol_name("rsvd14") - 1629 .dwattr $C$DW$132, DW_AT_data_member_location[DW_OP_plus_uconst 0x14] - 1630 .dwattr $C$DW$132, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1631 .dwattr $C$DW$132, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1632 .dwattr $C$DW$132, DW_AT_decl_line(0x63) - 1633 .dwattr $C$DW$132, DW_AT_decl_column(0x0b) - 1634$C$DW$133 .dwtag DW_TAG_member - 1635 .dwattr $C$DW$133, DW_AT_type(*$C$DW$T$85) - 1636 .dwattr $C$DW$133, DW_AT_name("$P$T18") - 1637 .dwattr $C$DW$133, DW_AT_TI_symbol_name("$P$T18") - 1638 .dwattr $C$DW$133, DW_AT_data_member_location[DW_OP_plus_uconst 0x20] - 1639 .dwattr $C$DW$133, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1640 .dwattr $C$DW$133, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1641 .dwattr $C$DW$133, DW_AT_decl_line(0x67) - 1642 .dwattr $C$DW$133, DW_AT_decl_column(0x02) - 1643$C$DW$134 .dwtag DW_TAG_member - 1644 .dwattr $C$DW$134, DW_AT_type(*$C$DW$T$87) - 1645 .dwattr $C$DW$134, DW_AT_name("$P$T19") - 1646 .dwattr $C$DW$134, DW_AT_TI_symbol_name("$P$T19") - 1647 .dwattr $C$DW$134, DW_AT_data_member_location[DW_OP_plus_uconst 0x24] - 1648 .dwattr $C$DW$134, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1649 .dwattr $C$DW$134, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1650 .dwattr $C$DW$134, DW_AT_decl_line(0x74) -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 31 - - 1651 .dwattr $C$DW$134, DW_AT_decl_column(0x02) - 1652$C$DW$135 .dwtag DW_TAG_member - 1653 .dwattr $C$DW$135, DW_AT_type(*$C$DW$T$89) - 1654 .dwattr $C$DW$135, DW_AT_name("$P$T20") - 1655 .dwattr $C$DW$135, DW_AT_TI_symbol_name("$P$T20") - 1656 .dwattr $C$DW$135, DW_AT_data_member_location[DW_OP_plus_uconst 0x28] - 1657 .dwattr $C$DW$135, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1658 .dwattr $C$DW$135, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1659 .dwattr $C$DW$135, DW_AT_decl_line(0x81) - 1660 .dwattr $C$DW$135, DW_AT_decl_column(0x02) - 1661$C$DW$136 .dwtag DW_TAG_member - 1662 .dwattr $C$DW$136, DW_AT_type(*$C$DW$T$91) - 1663 .dwattr $C$DW$136, DW_AT_name("$P$T21") - 1664 .dwattr $C$DW$136, DW_AT_TI_symbol_name("$P$T21") - 1665 .dwattr $C$DW$136, DW_AT_data_member_location[DW_OP_plus_uconst 0x2c] - 1666 .dwattr $C$DW$136, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1667 .dwattr $C$DW$136, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1668 .dwattr $C$DW$136, DW_AT_decl_line(0x8c) - 1669 .dwattr $C$DW$136, DW_AT_decl_column(0x02) - 1670 .dwendtag $C$DW$T$46 - 1671 - 1672 .dwattr $C$DW$T$46, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1673 .dwattr $C$DW$T$46, DW_AT_decl_line(0x26) - 1674 .dwattr $C$DW$T$46, DW_AT_decl_column(0x10) - 1675$C$DW$T$102 .dwtag DW_TAG_typedef, DW_AT_name("pruCtrl") - 1676 .dwattr $C$DW$T$102, DW_AT_type(*$C$DW$T$46) - 1677 .dwattr $C$DW$T$102, DW_AT_language(DW_LANG_C) - 1678 .dwattr $C$DW$T$102, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/ - 1679 .dwattr $C$DW$T$102, DW_AT_decl_line(0x95) - 1680 .dwattr $C$DW$T$102, DW_AT_decl_column(0x03) - 1681 - 1682$C$DW$T$49 .dwtag DW_TAG_union_type - 1683 .dwattr $C$DW$T$49, DW_AT_byte_size(0x04) - 1684$C$DW$137 .dwtag DW_TAG_member - 1685 .dwattr $C$DW$137, DW_AT_type(*$C$DW$T$47) - 1686 .dwattr $C$DW$137, DW_AT_name("REVID") - 1687 .dwattr $C$DW$137, DW_AT_TI_symbol_name("REVID") - 1688 .dwattr $C$DW$137, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1689 .dwattr $C$DW$137, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1690 .dwattr $C$DW$137, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1691 .dwattr $C$DW$137, DW_AT_decl_line(0x2a) - 1692 .dwattr $C$DW$137, DW_AT_decl_column(0x15) - 1693$C$DW$138 .dwtag DW_TAG_member - 1694 .dwattr $C$DW$138, DW_AT_type(*$C$DW$T$48) - 1695 .dwattr $C$DW$138, DW_AT_name("REVID_bit") - 1696 .dwattr $C$DW$138, DW_AT_TI_symbol_name("REVID_bit") - 1697 .dwattr $C$DW$138, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1698 .dwattr $C$DW$138, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1699 .dwattr $C$DW$138, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1700 .dwattr $C$DW$138, DW_AT_decl_line(0x2e) - 1701 .dwattr $C$DW$138, DW_AT_decl_column(0x05) - 1702 .dwendtag $C$DW$T$49 - 1703 - 1704 .dwattr $C$DW$T$49, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1705 .dwattr $C$DW$T$49, DW_AT_decl_line(0x29) -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 32 - - 1706 .dwattr $C$DW$T$49, DW_AT_decl_column(0x08) - 1707 - 1708$C$DW$T$51 .dwtag DW_TAG_union_type - 1709 .dwattr $C$DW$T$51, DW_AT_byte_size(0x04) - 1710$C$DW$139 .dwtag DW_TAG_member - 1711 .dwattr $C$DW$139, DW_AT_type(*$C$DW$T$47) - 1712 .dwattr $C$DW$139, DW_AT_name("SYSCFG") - 1713 .dwattr $C$DW$139, DW_AT_TI_symbol_name("SYSCFG") - 1714 .dwattr $C$DW$139, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1715 .dwattr $C$DW$139, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1716 .dwattr $C$DW$139, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1717 .dwattr $C$DW$139, DW_AT_decl_line(0x34) - 1718 .dwattr $C$DW$139, DW_AT_decl_column(0x15) - 1719$C$DW$140 .dwtag DW_TAG_member - 1720 .dwattr $C$DW$140, DW_AT_type(*$C$DW$T$50) - 1721 .dwattr $C$DW$140, DW_AT_name("SYSCFG_bit") - 1722 .dwattr $C$DW$140, DW_AT_TI_symbol_name("SYSCFG_bit") - 1723 .dwattr $C$DW$140, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1724 .dwattr $C$DW$140, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1725 .dwattr $C$DW$140, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1726 .dwattr $C$DW$140, DW_AT_decl_line(0x3c) - 1727 .dwattr $C$DW$140, DW_AT_decl_column(0x05) - 1728 .dwendtag $C$DW$T$51 - 1729 - 1730 .dwattr $C$DW$T$51, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1731 .dwattr $C$DW$T$51, DW_AT_decl_line(0x33) - 1732 .dwattr $C$DW$T$51, DW_AT_decl_column(0x08) - 1733 - 1734$C$DW$T$53 .dwtag DW_TAG_union_type - 1735 .dwattr $C$DW$T$53, DW_AT_byte_size(0x04) - 1736$C$DW$141 .dwtag DW_TAG_member - 1737 .dwattr $C$DW$141, DW_AT_type(*$C$DW$T$47) - 1738 .dwattr $C$DW$141, DW_AT_name("GPCFG0") - 1739 .dwattr $C$DW$141, DW_AT_TI_symbol_name("GPCFG0") - 1740 .dwattr $C$DW$141, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1741 .dwattr $C$DW$141, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1742 .dwattr $C$DW$141, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1743 .dwattr $C$DW$141, DW_AT_decl_line(0x42) - 1744 .dwattr $C$DW$141, DW_AT_decl_column(0x15) - 1745$C$DW$142 .dwtag DW_TAG_member - 1746 .dwattr $C$DW$142, DW_AT_type(*$C$DW$T$52) - 1747 .dwattr $C$DW$142, DW_AT_name("GPCFG0_bit") - 1748 .dwattr $C$DW$142, DW_AT_TI_symbol_name("GPCFG0_bit") - 1749 .dwattr $C$DW$142, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1750 .dwattr $C$DW$142, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1751 .dwattr $C$DW$142, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1752 .dwattr $C$DW$142, DW_AT_decl_line(0x4f) - 1753 .dwattr $C$DW$142, DW_AT_decl_column(0x05) - 1754 .dwendtag $C$DW$T$53 - 1755 - 1756 .dwattr $C$DW$T$53, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1757 .dwattr $C$DW$T$53, DW_AT_decl_line(0x41) - 1758 .dwattr $C$DW$T$53, DW_AT_decl_column(0x08) - 1759 - 1760$C$DW$T$55 .dwtag DW_TAG_union_type -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 33 - - 1761 .dwattr $C$DW$T$55, DW_AT_byte_size(0x04) - 1762$C$DW$143 .dwtag DW_TAG_member - 1763 .dwattr $C$DW$143, DW_AT_type(*$C$DW$T$47) - 1764 .dwattr $C$DW$143, DW_AT_name("GPCFG1") - 1765 .dwattr $C$DW$143, DW_AT_TI_symbol_name("GPCFG1") - 1766 .dwattr $C$DW$143, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1767 .dwattr $C$DW$143, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1768 .dwattr $C$DW$143, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1769 .dwattr $C$DW$143, DW_AT_decl_line(0x55) - 1770 .dwattr $C$DW$143, DW_AT_decl_column(0x15) - 1771$C$DW$144 .dwtag DW_TAG_member - 1772 .dwattr $C$DW$144, DW_AT_type(*$C$DW$T$54) - 1773 .dwattr $C$DW$144, DW_AT_name("GPCFG1_bit") - 1774 .dwattr $C$DW$144, DW_AT_TI_symbol_name("GPCFG1_bit") - 1775 .dwattr $C$DW$144, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1776 .dwattr $C$DW$144, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1777 .dwattr $C$DW$144, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1778 .dwattr $C$DW$144, DW_AT_decl_line(0x62) - 1779 .dwattr $C$DW$144, DW_AT_decl_column(0x05) - 1780 .dwendtag $C$DW$T$55 - 1781 - 1782 .dwattr $C$DW$T$55, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1783 .dwattr $C$DW$T$55, DW_AT_decl_line(0x54) - 1784 .dwattr $C$DW$T$55, DW_AT_decl_column(0x08) - 1785 - 1786$C$DW$T$57 .dwtag DW_TAG_union_type - 1787 .dwattr $C$DW$T$57, DW_AT_byte_size(0x04) - 1788$C$DW$145 .dwtag DW_TAG_member - 1789 .dwattr $C$DW$145, DW_AT_type(*$C$DW$T$47) - 1790 .dwattr $C$DW$145, DW_AT_name("CGR") - 1791 .dwattr $C$DW$145, DW_AT_TI_symbol_name("CGR") - 1792 .dwattr $C$DW$145, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1793 .dwattr $C$DW$145, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1794 .dwattr $C$DW$145, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1795 .dwattr $C$DW$145, DW_AT_decl_line(0x68) - 1796 .dwattr $C$DW$145, DW_AT_decl_column(0x15) - 1797$C$DW$146 .dwtag DW_TAG_member - 1798 .dwattr $C$DW$146, DW_AT_type(*$C$DW$T$56) - 1799 .dwattr $C$DW$146, DW_AT_name("CGR_bit") - 1800 .dwattr $C$DW$146, DW_AT_TI_symbol_name("CGR_bit") - 1801 .dwattr $C$DW$146, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1802 .dwattr $C$DW$146, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1803 .dwattr $C$DW$146, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1804 .dwattr $C$DW$146, DW_AT_decl_line(0x7e) - 1805 .dwattr $C$DW$146, DW_AT_decl_column(0x05) - 1806 .dwendtag $C$DW$T$57 - 1807 - 1808 .dwattr $C$DW$T$57, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1809 .dwattr $C$DW$T$57, DW_AT_decl_line(0x67) - 1810 .dwattr $C$DW$T$57, DW_AT_decl_column(0x08) - 1811 - 1812$C$DW$T$59 .dwtag DW_TAG_union_type - 1813 .dwattr $C$DW$T$59, DW_AT_byte_size(0x04) - 1814$C$DW$147 .dwtag DW_TAG_member - 1815 .dwattr $C$DW$147, DW_AT_type(*$C$DW$T$47) -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 34 - - 1816 .dwattr $C$DW$147, DW_AT_name("ISRP") - 1817 .dwattr $C$DW$147, DW_AT_TI_symbol_name("ISRP") - 1818 .dwattr $C$DW$147, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1819 .dwattr $C$DW$147, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1820 .dwattr $C$DW$147, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1821 .dwattr $C$DW$147, DW_AT_decl_line(0x84) - 1822 .dwattr $C$DW$147, DW_AT_decl_column(0x15) - 1823$C$DW$148 .dwtag DW_TAG_member - 1824 .dwattr $C$DW$148, DW_AT_type(*$C$DW$T$58) - 1825 .dwattr $C$DW$148, DW_AT_name("ISRP_bit") - 1826 .dwattr $C$DW$148, DW_AT_TI_symbol_name("ISRP_bit") - 1827 .dwattr $C$DW$148, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1828 .dwattr $C$DW$148, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1829 .dwattr $C$DW$148, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1830 .dwattr $C$DW$148, DW_AT_decl_line(0x8d) - 1831 .dwattr $C$DW$148, DW_AT_decl_column(0x05) - 1832 .dwendtag $C$DW$T$59 - 1833 - 1834 .dwattr $C$DW$T$59, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1835 .dwattr $C$DW$T$59, DW_AT_decl_line(0x83) - 1836 .dwattr $C$DW$T$59, DW_AT_decl_column(0x08) - 1837 - 1838$C$DW$T$61 .dwtag DW_TAG_union_type - 1839 .dwattr $C$DW$T$61, DW_AT_byte_size(0x04) - 1840$C$DW$149 .dwtag DW_TAG_member - 1841 .dwattr $C$DW$149, DW_AT_type(*$C$DW$T$47) - 1842 .dwattr $C$DW$149, DW_AT_name("ISP") - 1843 .dwattr $C$DW$149, DW_AT_TI_symbol_name("ISP") - 1844 .dwattr $C$DW$149, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1845 .dwattr $C$DW$149, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1846 .dwattr $C$DW$149, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1847 .dwattr $C$DW$149, DW_AT_decl_line(0x93) - 1848 .dwattr $C$DW$149, DW_AT_decl_column(0x15) - 1849$C$DW$150 .dwtag DW_TAG_member - 1850 .dwattr $C$DW$150, DW_AT_type(*$C$DW$T$60) - 1851 .dwattr $C$DW$150, DW_AT_name("ISP_bit") - 1852 .dwattr $C$DW$150, DW_AT_TI_symbol_name("ISP_bit") - 1853 .dwattr $C$DW$150, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1854 .dwattr $C$DW$150, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1855 .dwattr $C$DW$150, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1856 .dwattr $C$DW$150, DW_AT_decl_line(0x9c) - 1857 .dwattr $C$DW$150, DW_AT_decl_column(0x05) - 1858 .dwendtag $C$DW$T$61 - 1859 - 1860 .dwattr $C$DW$T$61, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1861 .dwattr $C$DW$T$61, DW_AT_decl_line(0x92) - 1862 .dwattr $C$DW$T$61, DW_AT_decl_column(0x08) - 1863 - 1864$C$DW$T$63 .dwtag DW_TAG_union_type - 1865 .dwattr $C$DW$T$63, DW_AT_byte_size(0x04) - 1866$C$DW$151 .dwtag DW_TAG_member - 1867 .dwattr $C$DW$151, DW_AT_type(*$C$DW$T$47) - 1868 .dwattr $C$DW$151, DW_AT_name("IESP") - 1869 .dwattr $C$DW$151, DW_AT_TI_symbol_name("IESP") - 1870 .dwattr $C$DW$151, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 35 - - 1871 .dwattr $C$DW$151, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1872 .dwattr $C$DW$151, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1873 .dwattr $C$DW$151, DW_AT_decl_line(0xa1) - 1874 .dwattr $C$DW$151, DW_AT_decl_column(0x15) - 1875$C$DW$152 .dwtag DW_TAG_member - 1876 .dwattr $C$DW$152, DW_AT_type(*$C$DW$T$62) - 1877 .dwattr $C$DW$152, DW_AT_name("IESP_bit") - 1878 .dwattr $C$DW$152, DW_AT_TI_symbol_name("IESP_bit") - 1879 .dwattr $C$DW$152, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1880 .dwattr $C$DW$152, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1881 .dwattr $C$DW$152, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1882 .dwattr $C$DW$152, DW_AT_decl_line(0xaa) - 1883 .dwattr $C$DW$152, DW_AT_decl_column(0x05) - 1884 .dwendtag $C$DW$T$63 - 1885 - 1886 .dwattr $C$DW$T$63, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1887 .dwattr $C$DW$T$63, DW_AT_decl_line(0xa0) - 1888 .dwattr $C$DW$T$63, DW_AT_decl_column(0x08) - 1889 - 1890$C$DW$T$65 .dwtag DW_TAG_union_type - 1891 .dwattr $C$DW$T$65, DW_AT_byte_size(0x04) - 1892$C$DW$153 .dwtag DW_TAG_member - 1893 .dwattr $C$DW$153, DW_AT_type(*$C$DW$T$47) - 1894 .dwattr $C$DW$153, DW_AT_name("IECP") - 1895 .dwattr $C$DW$153, DW_AT_TI_symbol_name("IECP") - 1896 .dwattr $C$DW$153, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1897 .dwattr $C$DW$153, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1898 .dwattr $C$DW$153, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1899 .dwattr $C$DW$153, DW_AT_decl_line(0xb0) - 1900 .dwattr $C$DW$153, DW_AT_decl_column(0x15) - 1901$C$DW$154 .dwtag DW_TAG_member - 1902 .dwattr $C$DW$154, DW_AT_type(*$C$DW$T$64) - 1903 .dwattr $C$DW$154, DW_AT_name("IECP_bit") - 1904 .dwattr $C$DW$154, DW_AT_TI_symbol_name("IECP_bit") - 1905 .dwattr $C$DW$154, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1906 .dwattr $C$DW$154, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1907 .dwattr $C$DW$154, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1908 .dwattr $C$DW$154, DW_AT_decl_line(0xb8) - 1909 .dwattr $C$DW$154, DW_AT_decl_column(0x05) - 1910 .dwendtag $C$DW$T$65 - 1911 - 1912 .dwattr $C$DW$T$65, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1913 .dwattr $C$DW$T$65, DW_AT_decl_line(0xaf) - 1914 .dwattr $C$DW$T$65, DW_AT_decl_column(0x08) - 1915 - 1916$C$DW$T$67 .dwtag DW_TAG_union_type - 1917 .dwattr $C$DW$T$67, DW_AT_byte_size(0x04) - 1918$C$DW$155 .dwtag DW_TAG_member - 1919 .dwattr $C$DW$155, DW_AT_type(*$C$DW$T$47) - 1920 .dwattr $C$DW$155, DW_AT_name("PMAO") - 1921 .dwattr $C$DW$155, DW_AT_TI_symbol_name("PMAO") - 1922 .dwattr $C$DW$155, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1923 .dwattr $C$DW$155, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1924 .dwattr $C$DW$155, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1925 .dwattr $C$DW$155, DW_AT_decl_line(0xc1) -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 36 - - 1926 .dwattr $C$DW$155, DW_AT_decl_column(0x15) - 1927$C$DW$156 .dwtag DW_TAG_member - 1928 .dwattr $C$DW$156, DW_AT_type(*$C$DW$T$66) - 1929 .dwattr $C$DW$156, DW_AT_name("PMAO_bit") - 1930 .dwattr $C$DW$156, DW_AT_TI_symbol_name("PMAO_bit") - 1931 .dwattr $C$DW$156, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1932 .dwattr $C$DW$156, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1933 .dwattr $C$DW$156, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1934 .dwattr $C$DW$156, DW_AT_decl_line(0xc7) - 1935 .dwattr $C$DW$156, DW_AT_decl_column(0x05) - 1936 .dwendtag $C$DW$T$67 - 1937 - 1938 .dwattr $C$DW$T$67, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1939 .dwattr $C$DW$T$67, DW_AT_decl_line(0xc0) - 1940 .dwattr $C$DW$T$67, DW_AT_decl_column(0x08) - 1941 - 1942$C$DW$T$69 .dwtag DW_TAG_union_type - 1943 .dwattr $C$DW$T$69, DW_AT_byte_size(0x04) - 1944$C$DW$157 .dwtag DW_TAG_member - 1945 .dwattr $C$DW$157, DW_AT_type(*$C$DW$T$47) - 1946 .dwattr $C$DW$157, DW_AT_name("IEPCLK") - 1947 .dwattr $C$DW$157, DW_AT_TI_symbol_name("IEPCLK") - 1948 .dwattr $C$DW$157, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1949 .dwattr $C$DW$157, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1950 .dwattr $C$DW$157, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1951 .dwattr $C$DW$157, DW_AT_decl_line(0xd0) - 1952 .dwattr $C$DW$157, DW_AT_decl_column(0x15) - 1953$C$DW$158 .dwtag DW_TAG_member - 1954 .dwattr $C$DW$158, DW_AT_type(*$C$DW$T$68) - 1955 .dwattr $C$DW$158, DW_AT_name("IEPCLK_bit") - 1956 .dwattr $C$DW$158, DW_AT_TI_symbol_name("IEPCLK_bit") - 1957 .dwattr $C$DW$158, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1958 .dwattr $C$DW$158, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1959 .dwattr $C$DW$158, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1960 .dwattr $C$DW$158, DW_AT_decl_line(0xd5) - 1961 .dwattr $C$DW$158, DW_AT_decl_column(0x05) - 1962 .dwendtag $C$DW$T$69 - 1963 - 1964 .dwattr $C$DW$T$69, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1965 .dwattr $C$DW$T$69, DW_AT_decl_line(0xcf) - 1966 .dwattr $C$DW$T$69, DW_AT_decl_column(0x08) - 1967 - 1968$C$DW$T$71 .dwtag DW_TAG_union_type - 1969 .dwattr $C$DW$T$71, DW_AT_byte_size(0x04) - 1970$C$DW$159 .dwtag DW_TAG_member - 1971 .dwattr $C$DW$159, DW_AT_type(*$C$DW$T$47) - 1972 .dwattr $C$DW$159, DW_AT_name("SPP") - 1973 .dwattr $C$DW$159, DW_AT_TI_symbol_name("SPP") - 1974 .dwattr $C$DW$159, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1975 .dwattr $C$DW$159, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1976 .dwattr $C$DW$159, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1977 .dwattr $C$DW$159, DW_AT_decl_line(0xdb) - 1978 .dwattr $C$DW$159, DW_AT_decl_column(0x15) - 1979$C$DW$160 .dwtag DW_TAG_member - 1980 .dwattr $C$DW$160, DW_AT_type(*$C$DW$T$70) -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 37 - - 1981 .dwattr $C$DW$160, DW_AT_name("SPP_bit") - 1982 .dwattr $C$DW$160, DW_AT_TI_symbol_name("SPP_bit") - 1983 .dwattr $C$DW$160, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 1984 .dwattr $C$DW$160, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 1985 .dwattr $C$DW$160, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 1986 .dwattr $C$DW$160, DW_AT_decl_line(0xe1) - 1987 .dwattr $C$DW$160, DW_AT_decl_column(0x05) - 1988 .dwendtag $C$DW$T$71 - 1989 - 1990 .dwattr $C$DW$T$71, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 1991 .dwattr $C$DW$T$71, DW_AT_decl_line(0xda) - 1992 .dwattr $C$DW$T$71, DW_AT_decl_column(0x08) - 1993 - 1994$C$DW$T$73 .dwtag DW_TAG_union_type - 1995 .dwattr $C$DW$T$73, DW_AT_byte_size(0x04) - 1996$C$DW$161 .dwtag DW_TAG_member - 1997 .dwattr $C$DW$161, DW_AT_type(*$C$DW$T$47) - 1998 .dwattr $C$DW$161, DW_AT_name("PIN_MX") - 1999 .dwattr $C$DW$161, DW_AT_TI_symbol_name("PIN_MX") - 2000 .dwattr $C$DW$161, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 2001 .dwattr $C$DW$161, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2002 .dwattr $C$DW$161, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 2003 .dwattr $C$DW$161, DW_AT_decl_line(0xe9) - 2004 .dwattr $C$DW$161, DW_AT_decl_column(0x15) - 2005$C$DW$162 .dwtag DW_TAG_member - 2006 .dwattr $C$DW$162, DW_AT_type(*$C$DW$T$72) - 2007 .dwattr $C$DW$162, DW_AT_name("PIN_MX_bit") - 2008 .dwattr $C$DW$162, DW_AT_TI_symbol_name("PIN_MX_bit") - 2009 .dwattr $C$DW$162, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 2010 .dwattr $C$DW$162, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2011 .dwattr $C$DW$162, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 2012 .dwattr $C$DW$162, DW_AT_decl_line(0xee) - 2013 .dwattr $C$DW$162, DW_AT_decl_column(0x05) - 2014 .dwendtag $C$DW$T$73 - 2015 - 2016 .dwattr $C$DW$T$73, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 2017 .dwattr $C$DW$T$73, DW_AT_decl_line(0xe8) - 2018 .dwattr $C$DW$T$73, DW_AT_decl_column(0x08) - 2019 - 2020$C$DW$T$75 .dwtag DW_TAG_union_type - 2021 .dwattr $C$DW$T$75, DW_AT_byte_size(0x04) - 2022$C$DW$163 .dwtag DW_TAG_member - 2023 .dwattr $C$DW$163, DW_AT_type(*$C$DW$T$47) - 2024 .dwattr $C$DW$163, DW_AT_name("CTRL") - 2025 .dwattr $C$DW$163, DW_AT_TI_symbol_name("CTRL") - 2026 .dwattr $C$DW$163, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 2027 .dwattr $C$DW$163, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2028 .dwattr $C$DW$163, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 2029 .dwattr $C$DW$163, DW_AT_decl_line(0x2a) - 2030 .dwattr $C$DW$163, DW_AT_decl_column(0x15) - 2031$C$DW$164 .dwtag DW_TAG_member - 2032 .dwattr $C$DW$164, DW_AT_type(*$C$DW$T$74) - 2033 .dwattr $C$DW$164, DW_AT_name("CTRL_bit") - 2034 .dwattr $C$DW$164, DW_AT_TI_symbol_name("CTRL_bit") - 2035 .dwattr $C$DW$164, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 38 - - 2036 .dwattr $C$DW$164, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2037 .dwattr $C$DW$164, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 2038 .dwattr $C$DW$164, DW_AT_decl_line(0x36) - 2039 .dwattr $C$DW$164, DW_AT_decl_column(0x05) - 2040 .dwendtag $C$DW$T$75 - 2041 - 2042 .dwattr $C$DW$T$75, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 2043 .dwattr $C$DW$T$75, DW_AT_decl_line(0x29) - 2044 .dwattr $C$DW$T$75, DW_AT_decl_column(0x08) - 2045 - 2046$C$DW$T$77 .dwtag DW_TAG_union_type - 2047 .dwattr $C$DW$T$77, DW_AT_byte_size(0x04) - 2048$C$DW$165 .dwtag DW_TAG_member - 2049 .dwattr $C$DW$165, DW_AT_type(*$C$DW$T$47) - 2050 .dwattr $C$DW$165, DW_AT_name("STS") - 2051 .dwattr $C$DW$165, DW_AT_TI_symbol_name("STS") - 2052 .dwattr $C$DW$165, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 2053 .dwattr $C$DW$165, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2054 .dwattr $C$DW$165, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 2055 .dwattr $C$DW$165, DW_AT_decl_line(0x3c) - 2056 .dwattr $C$DW$165, DW_AT_decl_column(0x15) - 2057$C$DW$166 .dwtag DW_TAG_member - 2058 .dwattr $C$DW$166, DW_AT_type(*$C$DW$T$76) - 2059 .dwattr $C$DW$166, DW_AT_name("STS_bit") - 2060 .dwattr $C$DW$166, DW_AT_TI_symbol_name("STS_bit") - 2061 .dwattr $C$DW$166, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 2062 .dwattr $C$DW$166, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2063 .dwattr $C$DW$166, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 2064 .dwattr $C$DW$166, DW_AT_decl_line(0x41) - 2065 .dwattr $C$DW$166, DW_AT_decl_column(0x05) - 2066 .dwendtag $C$DW$T$77 - 2067 - 2068 .dwattr $C$DW$T$77, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 2069 .dwattr $C$DW$T$77, DW_AT_decl_line(0x3b) - 2070 .dwattr $C$DW$T$77, DW_AT_decl_column(0x08) - 2071 - 2072$C$DW$T$79 .dwtag DW_TAG_union_type - 2073 .dwattr $C$DW$T$79, DW_AT_byte_size(0x04) - 2074$C$DW$167 .dwtag DW_TAG_member - 2075 .dwattr $C$DW$167, DW_AT_type(*$C$DW$T$47) - 2076 .dwattr $C$DW$167, DW_AT_name("WAKEUP_EN") - 2077 .dwattr $C$DW$167, DW_AT_TI_symbol_name("WAKEUP_EN") - 2078 .dwattr $C$DW$167, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 2079 .dwattr $C$DW$167, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2080 .dwattr $C$DW$167, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 2081 .dwattr $C$DW$167, DW_AT_decl_line(0x47) - 2082 .dwattr $C$DW$167, DW_AT_decl_column(0x15) - 2083$C$DW$168 .dwtag DW_TAG_member - 2084 .dwattr $C$DW$168, DW_AT_type(*$C$DW$T$78) - 2085 .dwattr $C$DW$168, DW_AT_name("WAKEUP_EN_bit") - 2086 .dwattr $C$DW$168, DW_AT_TI_symbol_name("WAKEUP_EN_bit") - 2087 .dwattr $C$DW$168, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 2088 .dwattr $C$DW$168, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2089 .dwattr $C$DW$168, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 2090 .dwattr $C$DW$168, DW_AT_decl_line(0x4b) -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 39 - - 2091 .dwattr $C$DW$168, DW_AT_decl_column(0x05) - 2092 .dwendtag $C$DW$T$79 - 2093 - 2094 .dwattr $C$DW$T$79, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 2095 .dwattr $C$DW$T$79, DW_AT_decl_line(0x46) - 2096 .dwattr $C$DW$T$79, DW_AT_decl_column(0x08) - 2097 - 2098$C$DW$T$81 .dwtag DW_TAG_union_type - 2099 .dwattr $C$DW$T$81, DW_AT_byte_size(0x04) - 2100$C$DW$169 .dwtag DW_TAG_member - 2101 .dwattr $C$DW$169, DW_AT_type(*$C$DW$T$47) - 2102 .dwattr $C$DW$169, DW_AT_name("CYCLE") - 2103 .dwattr $C$DW$169, DW_AT_TI_symbol_name("CYCLE") - 2104 .dwattr $C$DW$169, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 2105 .dwattr $C$DW$169, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2106 .dwattr $C$DW$169, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 2107 .dwattr $C$DW$169, DW_AT_decl_line(0x51) - 2108 .dwattr $C$DW$169, DW_AT_decl_column(0x15) - 2109$C$DW$170 .dwtag DW_TAG_member - 2110 .dwattr $C$DW$170, DW_AT_type(*$C$DW$T$80) - 2111 .dwattr $C$DW$170, DW_AT_name("CYCLE_bit") - 2112 .dwattr $C$DW$170, DW_AT_TI_symbol_name("CYCLE_bit") - 2113 .dwattr $C$DW$170, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 2114 .dwattr $C$DW$170, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2115 .dwattr $C$DW$170, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 2116 .dwattr $C$DW$170, DW_AT_decl_line(0x55) - 2117 .dwattr $C$DW$170, DW_AT_decl_column(0x05) - 2118 .dwendtag $C$DW$T$81 - 2119 - 2120 .dwattr $C$DW$T$81, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 2121 .dwattr $C$DW$T$81, DW_AT_decl_line(0x50) - 2122 .dwattr $C$DW$T$81, DW_AT_decl_column(0x08) - 2123 - 2124$C$DW$T$83 .dwtag DW_TAG_union_type - 2125 .dwattr $C$DW$T$83, DW_AT_byte_size(0x04) - 2126$C$DW$171 .dwtag DW_TAG_member - 2127 .dwattr $C$DW$171, DW_AT_type(*$C$DW$T$47) - 2128 .dwattr $C$DW$171, DW_AT_name("STALL") - 2129 .dwattr $C$DW$171, DW_AT_TI_symbol_name("STALL") - 2130 .dwattr $C$DW$171, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 2131 .dwattr $C$DW$171, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2132 .dwattr $C$DW$171, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 2133 .dwattr $C$DW$171, DW_AT_decl_line(0x5b) - 2134 .dwattr $C$DW$171, DW_AT_decl_column(0x15) - 2135$C$DW$172 .dwtag DW_TAG_member - 2136 .dwattr $C$DW$172, DW_AT_type(*$C$DW$T$82) - 2137 .dwattr $C$DW$172, DW_AT_name("STALL_bit") - 2138 .dwattr $C$DW$172, DW_AT_TI_symbol_name("STALL_bit") - 2139 .dwattr $C$DW$172, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 2140 .dwattr $C$DW$172, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2141 .dwattr $C$DW$172, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 2142 .dwattr $C$DW$172, DW_AT_decl_line(0x5f) - 2143 .dwattr $C$DW$172, DW_AT_decl_column(0x05) - 2144 .dwendtag $C$DW$T$83 - 2145 -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 40 - - 2146 .dwattr $C$DW$T$83, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 2147 .dwattr $C$DW$T$83, DW_AT_decl_line(0x5a) - 2148 .dwattr $C$DW$T$83, DW_AT_decl_column(0x08) - 2149 - 2150$C$DW$T$85 .dwtag DW_TAG_union_type - 2151 .dwattr $C$DW$T$85, DW_AT_byte_size(0x04) - 2152$C$DW$173 .dwtag DW_TAG_member - 2153 .dwattr $C$DW$173, DW_AT_type(*$C$DW$T$47) - 2154 .dwattr $C$DW$173, DW_AT_name("CTBIR0") - 2155 .dwattr $C$DW$173, DW_AT_TI_symbol_name("CTBIR0") - 2156 .dwattr $C$DW$173, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 2157 .dwattr $C$DW$173, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2158 .dwattr $C$DW$173, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 2159 .dwattr $C$DW$173, DW_AT_decl_line(0x68) - 2160 .dwattr $C$DW$173, DW_AT_decl_column(0x15) - 2161$C$DW$174 .dwtag DW_TAG_member - 2162 .dwattr $C$DW$174, DW_AT_type(*$C$DW$T$84) - 2163 .dwattr $C$DW$174, DW_AT_name("CTBIR0_bit") - 2164 .dwattr $C$DW$174, DW_AT_TI_symbol_name("CTBIR0_bit") - 2165 .dwattr $C$DW$174, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 2166 .dwattr $C$DW$174, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2167 .dwattr $C$DW$174, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 2168 .dwattr $C$DW$174, DW_AT_decl_line(0x6f) - 2169 .dwattr $C$DW$174, DW_AT_decl_column(0x05) - 2170 .dwendtag $C$DW$T$85 - 2171 - 2172 .dwattr $C$DW$T$85, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 2173 .dwattr $C$DW$T$85, DW_AT_decl_line(0x67) - 2174 .dwattr $C$DW$T$85, DW_AT_decl_column(0x08) - 2175 - 2176$C$DW$T$87 .dwtag DW_TAG_union_type - 2177 .dwattr $C$DW$T$87, DW_AT_byte_size(0x04) - 2178$C$DW$175 .dwtag DW_TAG_member - 2179 .dwattr $C$DW$175, DW_AT_type(*$C$DW$T$47) - 2180 .dwattr $C$DW$175, DW_AT_name("CTBIR1") - 2181 .dwattr $C$DW$175, DW_AT_TI_symbol_name("CTBIR1") - 2182 .dwattr $C$DW$175, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 2183 .dwattr $C$DW$175, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2184 .dwattr $C$DW$175, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 2185 .dwattr $C$DW$175, DW_AT_decl_line(0x75) - 2186 .dwattr $C$DW$175, DW_AT_decl_column(0x15) - 2187$C$DW$176 .dwtag DW_TAG_member - 2188 .dwattr $C$DW$176, DW_AT_type(*$C$DW$T$86) - 2189 .dwattr $C$DW$176, DW_AT_name("CTBIR1_bit") - 2190 .dwattr $C$DW$176, DW_AT_TI_symbol_name("CTBIR1_bit") - 2191 .dwattr $C$DW$176, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 2192 .dwattr $C$DW$176, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2193 .dwattr $C$DW$176, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 2194 .dwattr $C$DW$176, DW_AT_decl_line(0x7c) - 2195 .dwattr $C$DW$176, DW_AT_decl_column(0x05) - 2196 .dwendtag $C$DW$T$87 - 2197 - 2198 .dwattr $C$DW$T$87, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 2199 .dwattr $C$DW$T$87, DW_AT_decl_line(0x74) - 2200 .dwattr $C$DW$T$87, DW_AT_decl_column(0x08) -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 41 - - 2201 - 2202$C$DW$T$89 .dwtag DW_TAG_union_type - 2203 .dwattr $C$DW$T$89, DW_AT_byte_size(0x04) - 2204$C$DW$177 .dwtag DW_TAG_member - 2205 .dwattr $C$DW$177, DW_AT_type(*$C$DW$T$47) - 2206 .dwattr $C$DW$177, DW_AT_name("CTPPR0") - 2207 .dwattr $C$DW$177, DW_AT_TI_symbol_name("CTPPR0") - 2208 .dwattr $C$DW$177, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 2209 .dwattr $C$DW$177, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2210 .dwattr $C$DW$177, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 2211 .dwattr $C$DW$177, DW_AT_decl_line(0x82) - 2212 .dwattr $C$DW$177, DW_AT_decl_column(0x15) - 2213$C$DW$178 .dwtag DW_TAG_member - 2214 .dwattr $C$DW$178, DW_AT_type(*$C$DW$T$88) - 2215 .dwattr $C$DW$178, DW_AT_name("CTPPR0_bit") - 2216 .dwattr $C$DW$178, DW_AT_TI_symbol_name("CTPPR0_bit") - 2217 .dwattr $C$DW$178, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 2218 .dwattr $C$DW$178, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2219 .dwattr $C$DW$178, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 2220 .dwattr $C$DW$178, DW_AT_decl_line(0x87) - 2221 .dwattr $C$DW$178, DW_AT_decl_column(0x05) - 2222 .dwendtag $C$DW$T$89 - 2223 - 2224 .dwattr $C$DW$T$89, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 2225 .dwattr $C$DW$T$89, DW_AT_decl_line(0x81) - 2226 .dwattr $C$DW$T$89, DW_AT_decl_column(0x08) - 2227 - 2228$C$DW$T$91 .dwtag DW_TAG_union_type - 2229 .dwattr $C$DW$T$91, DW_AT_byte_size(0x04) - 2230$C$DW$179 .dwtag DW_TAG_member - 2231 .dwattr $C$DW$179, DW_AT_type(*$C$DW$T$47) - 2232 .dwattr $C$DW$179, DW_AT_name("CTPPR1") - 2233 .dwattr $C$DW$179, DW_AT_TI_symbol_name("CTPPR1") - 2234 .dwattr $C$DW$179, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 2235 .dwattr $C$DW$179, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2236 .dwattr $C$DW$179, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 2237 .dwattr $C$DW$179, DW_AT_decl_line(0x8d) - 2238 .dwattr $C$DW$179, DW_AT_decl_column(0x15) - 2239$C$DW$180 .dwtag DW_TAG_member - 2240 .dwattr $C$DW$180, DW_AT_type(*$C$DW$T$90) - 2241 .dwattr $C$DW$180, DW_AT_name("CTPPR1_bit") - 2242 .dwattr $C$DW$180, DW_AT_TI_symbol_name("CTPPR1_bit") - 2243 .dwattr $C$DW$180, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 2244 .dwattr $C$DW$180, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2245 .dwattr $C$DW$180, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/pr - 2246 .dwattr $C$DW$180, DW_AT_decl_line(0x92) - 2247 .dwattr $C$DW$180, DW_AT_decl_column(0x05) - 2248 .dwendtag $C$DW$T$91 - 2249 - 2250 .dwattr $C$DW$T$91, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/am335x/p - 2251 .dwattr $C$DW$T$91, DW_AT_decl_line(0x8c) - 2252 .dwattr $C$DW$T$91, DW_AT_decl_column(0x08) - 2253$C$DW$T$2 .dwtag DW_TAG_unspecified_type - 2254 .dwattr $C$DW$T$2, DW_AT_name("void") - 2255$C$DW$T$4 .dwtag DW_TAG_base_type -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 42 - - 2256 .dwattr $C$DW$T$4, DW_AT_encoding(DW_ATE_boolean) - 2257 .dwattr $C$DW$T$4, DW_AT_name("bool") - 2258 .dwattr $C$DW$T$4, DW_AT_byte_size(0x01) - 2259$C$DW$T$5 .dwtag DW_TAG_base_type - 2260 .dwattr $C$DW$T$5, DW_AT_encoding(DW_ATE_signed_char) - 2261 .dwattr $C$DW$T$5, DW_AT_name("signed char") - 2262 .dwattr $C$DW$T$5, DW_AT_byte_size(0x01) - 2263$C$DW$T$6 .dwtag DW_TAG_base_type - 2264 .dwattr $C$DW$T$6, DW_AT_encoding(DW_ATE_unsigned_char) - 2265 .dwattr $C$DW$T$6, DW_AT_name("unsigned char") - 2266 .dwattr $C$DW$T$6, DW_AT_byte_size(0x01) - 2267$C$DW$T$7 .dwtag DW_TAG_base_type - 2268 .dwattr $C$DW$T$7, DW_AT_encoding(DW_ATE_signed_char) - 2269 .dwattr $C$DW$T$7, DW_AT_name("wchar_t") - 2270 .dwattr $C$DW$T$7, DW_AT_byte_size(0x04) - 2271$C$DW$T$8 .dwtag DW_TAG_base_type - 2272 .dwattr $C$DW$T$8, DW_AT_encoding(DW_ATE_signed) - 2273 .dwattr $C$DW$T$8, DW_AT_name("short") - 2274 .dwattr $C$DW$T$8, DW_AT_byte_size(0x02) - 2275$C$DW$T$9 .dwtag DW_TAG_base_type - 2276 .dwattr $C$DW$T$9, DW_AT_encoding(DW_ATE_unsigned) - 2277 .dwattr $C$DW$T$9, DW_AT_name("unsigned short") - 2278 .dwattr $C$DW$T$9, DW_AT_byte_size(0x02) - 2279$C$DW$T$10 .dwtag DW_TAG_base_type - 2280 .dwattr $C$DW$T$10, DW_AT_encoding(DW_ATE_signed) - 2281 .dwattr $C$DW$T$10, DW_AT_name("int") - 2282 .dwattr $C$DW$T$10, DW_AT_byte_size(0x04) - 2283$C$DW$T$11 .dwtag DW_TAG_base_type - 2284 .dwattr $C$DW$T$11, DW_AT_encoding(DW_ATE_unsigned) - 2285 .dwattr $C$DW$T$11, DW_AT_name("unsigned int") - 2286 .dwattr $C$DW$T$11, DW_AT_byte_size(0x04) - 2287$C$DW$T$32 .dwtag DW_TAG_typedef, DW_AT_name("uint32_t") - 2288 .dwattr $C$DW$T$32, DW_AT_type(*$C$DW$T$11) - 2289 .dwattr $C$DW$T$32, DW_AT_language(DW_LANG_C) - 2290 .dwattr $C$DW$T$32, DW_AT_decl_file("/usr/share/ti/cgt-pru/include/stdint.h") - 2291 .dwattr $C$DW$T$32, DW_AT_decl_line(0x2f) - 2292 .dwattr $C$DW$T$32, DW_AT_decl_column(0x1c) - 2293 - 2294$C$DW$T$33 .dwtag DW_TAG_array_type - 2295 .dwattr $C$DW$T$33, DW_AT_type(*$C$DW$T$32) - 2296 .dwattr $C$DW$T$33, DW_AT_language(DW_LANG_C) - 2297 .dwattr $C$DW$T$33, DW_AT_byte_size(0x04) - 2298$C$DW$181 .dwtag DW_TAG_subrange_type - 2299 .dwattr $C$DW$181, DW_AT_upper_bound(0x00) - 2300 .dwendtag $C$DW$T$33 - 2301 - 2302 - 2303$C$DW$T$34 .dwtag DW_TAG_array_type - 2304 .dwattr $C$DW$T$34, DW_AT_type(*$C$DW$T$32) - 2305 .dwattr $C$DW$T$34, DW_AT_language(DW_LANG_C) - 2306 .dwattr $C$DW$T$34, DW_AT_byte_size(0x08) - 2307$C$DW$182 .dwtag DW_TAG_subrange_type - 2308 .dwattr $C$DW$182, DW_AT_upper_bound(0x01) - 2309 .dwendtag $C$DW$T$34 - 2310 -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 43 - - 2311 - 2312$C$DW$T$45 .dwtag DW_TAG_array_type - 2313 .dwattr $C$DW$T$45, DW_AT_type(*$C$DW$T$32) - 2314 .dwattr $C$DW$T$45, DW_AT_language(DW_LANG_C) - 2315 .dwattr $C$DW$T$45, DW_AT_byte_size(0x0c) - 2316$C$DW$183 .dwtag DW_TAG_subrange_type - 2317 .dwattr $C$DW$183, DW_AT_upper_bound(0x02) - 2318 .dwendtag $C$DW$T$45 - 2319 - 2320$C$DW$T$47 .dwtag DW_TAG_volatile_type - 2321 .dwattr $C$DW$T$47, DW_AT_type(*$C$DW$T$32) - 2322$C$DW$T$12 .dwtag DW_TAG_base_type - 2323 .dwattr $C$DW$T$12, DW_AT_encoding(DW_ATE_signed) - 2324 .dwattr $C$DW$T$12, DW_AT_name("long") - 2325 .dwattr $C$DW$T$12, DW_AT_byte_size(0x04) - 2326$C$DW$T$13 .dwtag DW_TAG_base_type - 2327 .dwattr $C$DW$T$13, DW_AT_encoding(DW_ATE_unsigned) - 2328 .dwattr $C$DW$T$13, DW_AT_name("unsigned long") - 2329 .dwattr $C$DW$T$13, DW_AT_byte_size(0x04) - 2330$C$DW$T$14 .dwtag DW_TAG_base_type - 2331 .dwattr $C$DW$T$14, DW_AT_encoding(DW_ATE_signed) - 2332 .dwattr $C$DW$T$14, DW_AT_name("long long") - 2333 .dwattr $C$DW$T$14, DW_AT_byte_size(0x08) - 2334$C$DW$T$15 .dwtag DW_TAG_base_type - 2335 .dwattr $C$DW$T$15, DW_AT_encoding(DW_ATE_unsigned) - 2336 .dwattr $C$DW$T$15, DW_AT_name("unsigned long long") - 2337 .dwattr $C$DW$T$15, DW_AT_byte_size(0x08) - 2338$C$DW$T$16 .dwtag DW_TAG_base_type - 2339 .dwattr $C$DW$T$16, DW_AT_encoding(DW_ATE_float) - 2340 .dwattr $C$DW$T$16, DW_AT_name("float") - 2341 .dwattr $C$DW$T$16, DW_AT_byte_size(0x04) - 2342$C$DW$T$17 .dwtag DW_TAG_base_type - 2343 .dwattr $C$DW$T$17, DW_AT_encoding(DW_ATE_float) - 2344 .dwattr $C$DW$T$17, DW_AT_name("double") - 2345 .dwattr $C$DW$T$17, DW_AT_byte_size(0x08) - 2346$C$DW$T$18 .dwtag DW_TAG_base_type - 2347 .dwattr $C$DW$T$18, DW_AT_encoding(DW_ATE_float) - 2348 .dwattr $C$DW$T$18, DW_AT_name("long double") - 2349 .dwattr $C$DW$T$18, DW_AT_byte_size(0x08) - 2350 - 2351$C$DW$T$92 .dwtag DW_TAG_structure_type - 2352 .dwattr $C$DW$T$92, DW_AT_name("my_resource_table") - 2353 .dwattr $C$DW$T$92, DW_AT_byte_size(0x14) - 2354$C$DW$184 .dwtag DW_TAG_member - 2355 .dwattr $C$DW$184, DW_AT_type(*$C$DW$T$93) - 2356 .dwattr $C$DW$184, DW_AT_name("base") - 2357 .dwattr $C$DW$184, DW_AT_TI_symbol_name("base") - 2358 .dwattr $C$DW$184, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 2359 .dwattr $C$DW$184, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2360 .dwattr $C$DW$184, DW_AT_decl_file("/var/lib/cloud9/common/resource_table_empty.h") - 2361 .dwattr $C$DW$184, DW_AT_decl_line(0x18) - 2362 .dwattr $C$DW$184, DW_AT_decl_column(0x18) - 2363$C$DW$185 .dwtag DW_TAG_member - 2364 .dwattr $C$DW$185, DW_AT_type(*$C$DW$T$33) - 2365 .dwattr $C$DW$185, DW_AT_name("offset") -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 44 - - 2366 .dwattr $C$DW$185, DW_AT_TI_symbol_name("offset") - 2367 .dwattr $C$DW$185, DW_AT_data_member_location[DW_OP_plus_uconst 0x10] - 2368 .dwattr $C$DW$185, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2369 .dwattr $C$DW$185, DW_AT_decl_file("/var/lib/cloud9/common/resource_table_empty.h") - 2370 .dwattr $C$DW$185, DW_AT_decl_line(0x1a) - 2371 .dwattr $C$DW$185, DW_AT_decl_column(0x0b) - 2372 .dwendtag $C$DW$T$92 - 2373 - 2374 .dwattr $C$DW$T$92, DW_AT_decl_file("/var/lib/cloud9/common/resource_table_empty.h") - 2375 .dwattr $C$DW$T$92, DW_AT_decl_line(0x17) - 2376 .dwattr $C$DW$T$92, DW_AT_decl_column(0x08) - 2377 - 2378$C$DW$T$93 .dwtag DW_TAG_structure_type - 2379 .dwattr $C$DW$T$93, DW_AT_name("resource_table") - 2380 .dwattr $C$DW$T$93, DW_AT_byte_size(0x10) - 2381$C$DW$186 .dwtag DW_TAG_member - 2382 .dwattr $C$DW$186, DW_AT_type(*$C$DW$T$32) - 2383 .dwattr $C$DW$186, DW_AT_name("ver") - 2384 .dwattr $C$DW$186, DW_AT_TI_symbol_name("ver") - 2385 .dwattr $C$DW$186, DW_AT_data_member_location[DW_OP_plus_uconst 0x0] - 2386 .dwattr $C$DW$186, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2387 .dwattr $C$DW$186, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/rsc_types - 2388 .dwattr $C$DW$186, DW_AT_decl_line(0x59) - 2389 .dwattr $C$DW$186, DW_AT_decl_column(0x0b) - 2390$C$DW$187 .dwtag DW_TAG_member - 2391 .dwattr $C$DW$187, DW_AT_type(*$C$DW$T$32) - 2392 .dwattr $C$DW$187, DW_AT_name("num") - 2393 .dwattr $C$DW$187, DW_AT_TI_symbol_name("num") - 2394 .dwattr $C$DW$187, DW_AT_data_member_location[DW_OP_plus_uconst 0x4] - 2395 .dwattr $C$DW$187, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2396 .dwattr $C$DW$187, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/rsc_types - 2397 .dwattr $C$DW$187, DW_AT_decl_line(0x5a) - 2398 .dwattr $C$DW$187, DW_AT_decl_column(0x0b) - 2399$C$DW$188 .dwtag DW_TAG_member - 2400 .dwattr $C$DW$188, DW_AT_type(*$C$DW$T$34) - 2401 .dwattr $C$DW$188, DW_AT_name("reserved") - 2402 .dwattr $C$DW$188, DW_AT_TI_symbol_name("reserved") - 2403 .dwattr $C$DW$188, DW_AT_data_member_location[DW_OP_plus_uconst 0x8] - 2404 .dwattr $C$DW$188, DW_AT_accessibility(DW_ACCESS_ai_64_lic) - 2405 .dwattr $C$DW$188, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/rsc_types - 2406 .dwattr $C$DW$188, DW_AT_decl_line(0x5b) - 2407 .dwattr $C$DW$188, DW_AT_decl_column(0x0b) - 2408 .dwendtag $C$DW$T$93 - 2409 - 2410 .dwattr $C$DW$T$93, DW_AT_decl_file("/usr/lib/ti/pru-software-support-package/include/rsc_type - 2411 .dwattr $C$DW$T$93, DW_AT_decl_line(0x58) - 2412 .dwattr $C$DW$T$93, DW_AT_decl_column(0x08) - 2413 .dwattr $C$DW$CU, DW_AT_language(DW_LANG_C) - 2414 - 2415;*************************************************************** - 2416;* DWARF CIE ENTRIES * - 2417;*************************************************************** - 2418 - 2419$C$DW$CIE .dwcie 14 - 2420 .dwcfi cfa_register, 8 -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 45 - - 2421 .dwcfi cfa_offset, 0 - 2422 .dwcfi undefined, 0 - 2423 .dwcfi undefined, 1 - 2424 .dwcfi undefined, 2 - 2425 .dwcfi undefined, 3 - 2426 .dwcfi undefined, 4 - 2427 .dwcfi undefined, 5 - 2428 .dwcfi undefined, 6 - 2429 .dwcfi undefined, 7 - 2430 .dwcfi same_value, 8 - 2431 .dwcfi same_value, 9 - 2432 .dwcfi same_value, 10 - 2433 .dwcfi same_value, 11 - 2434 .dwcfi undefined, 12 - 2435 .dwcfi undefined, 13 - 2436 .dwcfi undefined, 14 - 2437 .dwcfi undefined, 15 - 2438 .dwcfi same_value, 16 - 2439 .dwcfi same_value, 17 - 2440 .dwcfi same_value, 18 - 2441 .dwcfi same_value, 19 - 2442 .dwcfi same_value, 20 - 2443 .dwcfi same_value, 21 - 2444 .dwcfi same_value, 22 - 2445 .dwcfi same_value, 23 - 2446 .dwcfi same_value, 24 - 2447 .dwcfi same_value, 25 - 2448 .dwcfi same_value, 26 - 2449 .dwcfi same_value, 27 - 2450 .dwcfi same_value, 28 - 2451 .dwcfi same_value, 29 - 2452 .dwcfi same_value, 30 - 2453 .dwcfi same_value, 31 - 2454 .dwcfi same_value, 32 - 2455 .dwcfi same_value, 33 - 2456 .dwcfi same_value, 34 - 2457 .dwcfi same_value, 35 - 2458 .dwcfi same_value, 36 - 2459 .dwcfi same_value, 37 - 2460 .dwcfi same_value, 38 - 2461 .dwcfi same_value, 39 - 2462 .dwcfi same_value, 40 - 2463 .dwcfi same_value, 41 - 2464 .dwcfi same_value, 42 - 2465 .dwcfi same_value, 43 - 2466 .dwcfi same_value, 44 - 2467 .dwcfi same_value, 45 - 2468 .dwcfi same_value, 46 - 2469 .dwcfi same_value, 47 - 2470 .dwcfi same_value, 48 - 2471 .dwcfi same_value, 49 - 2472 .dwcfi same_value, 50 - 2473 .dwcfi same_value, 51 - 2474 .dwcfi same_value, 52 - 2475 .dwcfi same_value, 53 -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 46 - - 2476 .dwcfi same_value, 54 - 2477 .dwcfi same_value, 55 - 2478 .dwcfi undefined, 56 - 2479 .dwcfi undefined, 57 - 2480 .dwcfi undefined, 58 - 2481 .dwcfi undefined, 59 - 2482 .dwcfi undefined, 60 - 2483 .dwcfi undefined, 61 - 2484 .dwcfi undefined, 62 - 2485 .dwcfi undefined, 63 - 2486 .dwcfi undefined, 64 - 2487 .dwcfi undefined, 65 - 2488 .dwcfi undefined, 66 - 2489 .dwcfi undefined, 67 - 2490 .dwcfi undefined, 68 - 2491 .dwcfi undefined, 69 - 2492 .dwcfi undefined, 70 - 2493 .dwcfi undefined, 71 - 2494 .dwcfi undefined, 72 - 2495 .dwcfi undefined, 73 - 2496 .dwcfi undefined, 74 - 2497 .dwcfi undefined, 75 - 2498 .dwcfi undefined, 76 - 2499 .dwcfi undefined, 77 - 2500 .dwcfi undefined, 78 - 2501 .dwcfi undefined, 79 - 2502 .dwcfi undefined, 80 - 2503 .dwcfi undefined, 81 - 2504 .dwcfi undefined, 82 - 2505 .dwcfi undefined, 83 - 2506 .dwcfi undefined, 84 - 2507 .dwcfi undefined, 85 - 2508 .dwcfi undefined, 86 - 2509 .dwcfi undefined, 87 - 2510 .dwcfi undefined, 88 - 2511 .dwcfi undefined, 89 - 2512 .dwcfi undefined, 90 - 2513 .dwcfi undefined, 91 - 2514 .dwcfi undefined, 92 - 2515 .dwcfi undefined, 93 - 2516 .dwcfi undefined, 94 - 2517 .dwcfi undefined, 95 - 2518 .dwcfi undefined, 96 - 2519 .dwcfi undefined, 97 - 2520 .dwcfi undefined, 98 - 2521 .dwcfi undefined, 99 - 2522 .dwcfi undefined, 100 - 2523 .dwcfi undefined, 101 - 2524 .dwcfi undefined, 102 - 2525 .dwcfi undefined, 103 - 2526 .dwcfi undefined, 104 - 2527 .dwcfi undefined, 105 - 2528 .dwcfi undefined, 106 - 2529 .dwcfi undefined, 107 - 2530 .dwcfi undefined, 108 -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 47 - - 2531 .dwcfi undefined, 109 - 2532 .dwcfi undefined, 110 - 2533 .dwcfi undefined, 111 - 2534 .dwcfi undefined, 112 - 2535 .dwcfi undefined, 113 - 2536 .dwcfi undefined, 114 - 2537 .dwcfi undefined, 115 - 2538 .dwcfi undefined, 116 - 2539 .dwcfi undefined, 117 - 2540 .dwcfi undefined, 118 - 2541 .dwcfi undefined, 119 - 2542 .dwcfi undefined, 120 - 2543 .dwcfi undefined, 121 - 2544 .dwcfi undefined, 122 - 2545 .dwcfi undefined, 123 - 2546 .dwcfi undefined, 124 - 2547 .dwcfi undefined, 125 - 2548 .dwcfi undefined, 126 - 2549 .dwcfi undefined, 127 - 2550 .dwcfi undefined, 128 - 2551 .dwcfi undefined, 129 - 2552 .dwcfi undefined, 130 - 2553 .dwcfi undefined, 131 - 2554 .dwcfi undefined, 132 - 2555 .dwcfi undefined, 133 - 2556 .dwcfi undefined, 134 - 2557 .dwendentry - 2558 - 2559;*************************************************************** - 2560;* DWARF REGISTER MAP * - 2561;*************************************************************** - 2562 - 2563$C$DW$189 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R0_b0") - 2564 .dwattr $C$DW$189, DW_AT_location[DW_OP_reg0] - 2565$C$DW$190 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R0_b1") - 2566 .dwattr $C$DW$190, DW_AT_location[DW_OP_reg1] - 2567$C$DW$191 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R0_b2") - 2568 .dwattr $C$DW$191, DW_AT_location[DW_OP_reg2] - 2569$C$DW$192 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R0_b3") - 2570 .dwattr $C$DW$192, DW_AT_location[DW_OP_reg3] - 2571$C$DW$193 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R1_b0") - 2572 .dwattr $C$DW$193, DW_AT_location[DW_OP_reg4] - 2573$C$DW$194 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R1_b1") - 2574 .dwattr $C$DW$194, DW_AT_location[DW_OP_reg5] - 2575$C$DW$195 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R1_b2") - 2576 .dwattr $C$DW$195, DW_AT_location[DW_OP_reg6] - 2577$C$DW$196 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R1_b3") - 2578 .dwattr $C$DW$196, DW_AT_location[DW_OP_reg7] - 2579$C$DW$197 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R2_b0") - 2580 .dwattr $C$DW$197, DW_AT_location[DW_OP_reg8] - 2581$C$DW$198 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R2_b1") - 2582 .dwattr $C$DW$198, DW_AT_location[DW_OP_reg9] - 2583$C$DW$199 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R2_b2") - 2584 .dwattr $C$DW$199, DW_AT_location[DW_OP_reg10] - 2585$C$DW$200 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R2_b3") -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 48 - - 2586 .dwattr $C$DW$200, DW_AT_location[DW_OP_reg11] - 2587$C$DW$201 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R3_b0") - 2588 .dwattr $C$DW$201, DW_AT_location[DW_OP_reg12] - 2589$C$DW$202 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R3_b1") - 2590 .dwattr $C$DW$202, DW_AT_location[DW_OP_reg13] - 2591$C$DW$203 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R3_b2") - 2592 .dwattr $C$DW$203, DW_AT_location[DW_OP_reg14] - 2593$C$DW$204 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R3_b3") - 2594 .dwattr $C$DW$204, DW_AT_location[DW_OP_reg15] - 2595$C$DW$205 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R4_b0") - 2596 .dwattr $C$DW$205, DW_AT_location[DW_OP_reg16] - 2597$C$DW$206 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R4_b1") - 2598 .dwattr $C$DW$206, DW_AT_location[DW_OP_reg17] - 2599$C$DW$207 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R4_b2") - 2600 .dwattr $C$DW$207, DW_AT_location[DW_OP_reg18] - 2601$C$DW$208 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R4_b3") - 2602 .dwattr $C$DW$208, DW_AT_location[DW_OP_reg19] - 2603$C$DW$209 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R5_b0") - 2604 .dwattr $C$DW$209, DW_AT_location[DW_OP_reg20] - 2605$C$DW$210 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R5_b1") - 2606 .dwattr $C$DW$210, DW_AT_location[DW_OP_reg21] - 2607$C$DW$211 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R5_b2") - 2608 .dwattr $C$DW$211, DW_AT_location[DW_OP_reg22] - 2609$C$DW$212 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R5_b3") - 2610 .dwattr $C$DW$212, DW_AT_location[DW_OP_reg23] - 2611$C$DW$213 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R6_b0") - 2612 .dwattr $C$DW$213, DW_AT_location[DW_OP_reg24] - 2613$C$DW$214 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R6_b1") - 2614 .dwattr $C$DW$214, DW_AT_location[DW_OP_reg25] - 2615$C$DW$215 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R6_b2") - 2616 .dwattr $C$DW$215, DW_AT_location[DW_OP_reg26] - 2617$C$DW$216 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R6_b3") - 2618 .dwattr $C$DW$216, DW_AT_location[DW_OP_reg27] - 2619$C$DW$217 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R7_b0") - 2620 .dwattr $C$DW$217, DW_AT_location[DW_OP_reg28] - 2621$C$DW$218 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R7_b1") - 2622 .dwattr $C$DW$218, DW_AT_location[DW_OP_reg29] - 2623$C$DW$219 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R7_b2") - 2624 .dwattr $C$DW$219, DW_AT_location[DW_OP_reg30] - 2625$C$DW$220 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R7_b3") - 2626 .dwattr $C$DW$220, DW_AT_location[DW_OP_reg31] - 2627$C$DW$221 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R8_b0") - 2628 .dwattr $C$DW$221, DW_AT_location[DW_OP_regx 0x20] - 2629$C$DW$222 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R8_b1") - 2630 .dwattr $C$DW$222, DW_AT_location[DW_OP_regx 0x21] - 2631$C$DW$223 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R8_b2") - 2632 .dwattr $C$DW$223, DW_AT_location[DW_OP_regx 0x22] - 2633$C$DW$224 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R8_b3") - 2634 .dwattr $C$DW$224, DW_AT_location[DW_OP_regx 0x23] - 2635$C$DW$225 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R9_b0") - 2636 .dwattr $C$DW$225, DW_AT_location[DW_OP_regx 0x24] - 2637$C$DW$226 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R9_b1") - 2638 .dwattr $C$DW$226, DW_AT_location[DW_OP_regx 0x25] - 2639$C$DW$227 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R9_b2") - 2640 .dwattr $C$DW$227, DW_AT_location[DW_OP_regx 0x26] -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 49 - - 2641$C$DW$228 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R9_b3") - 2642 .dwattr $C$DW$228, DW_AT_location[DW_OP_regx 0x27] - 2643$C$DW$229 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R10_b0") - 2644 .dwattr $C$DW$229, DW_AT_location[DW_OP_regx 0x28] - 2645$C$DW$230 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R10_b1") - 2646 .dwattr $C$DW$230, DW_AT_location[DW_OP_regx 0x29] - 2647$C$DW$231 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R10_b2") - 2648 .dwattr $C$DW$231, DW_AT_location[DW_OP_regx 0x2a] - 2649$C$DW$232 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R10_b3") - 2650 .dwattr $C$DW$232, DW_AT_location[DW_OP_regx 0x2b] - 2651$C$DW$233 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R11_b0") - 2652 .dwattr $C$DW$233, DW_AT_location[DW_OP_regx 0x2c] - 2653$C$DW$234 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R11_b1") - 2654 .dwattr $C$DW$234, DW_AT_location[DW_OP_regx 0x2d] - 2655$C$DW$235 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R11_b2") - 2656 .dwattr $C$DW$235, DW_AT_location[DW_OP_regx 0x2e] - 2657$C$DW$236 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R11_b3") - 2658 .dwattr $C$DW$236, DW_AT_location[DW_OP_regx 0x2f] - 2659$C$DW$237 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R12_b0") - 2660 .dwattr $C$DW$237, DW_AT_location[DW_OP_regx 0x30] - 2661$C$DW$238 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R12_b1") - 2662 .dwattr $C$DW$238, DW_AT_location[DW_OP_regx 0x31] - 2663$C$DW$239 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R12_b2") - 2664 .dwattr $C$DW$239, DW_AT_location[DW_OP_regx 0x32] - 2665$C$DW$240 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R12_b3") - 2666 .dwattr $C$DW$240, DW_AT_location[DW_OP_regx 0x33] - 2667$C$DW$241 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R13_b0") - 2668 .dwattr $C$DW$241, DW_AT_location[DW_OP_regx 0x34] - 2669$C$DW$242 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R13_b1") - 2670 .dwattr $C$DW$242, DW_AT_location[DW_OP_regx 0x35] - 2671$C$DW$243 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R13_b2") - 2672 .dwattr $C$DW$243, DW_AT_location[DW_OP_regx 0x36] - 2673$C$DW$244 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R13_b3") - 2674 .dwattr $C$DW$244, DW_AT_location[DW_OP_regx 0x37] - 2675$C$DW$245 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R14_b0") - 2676 .dwattr $C$DW$245, DW_AT_location[DW_OP_regx 0x38] - 2677$C$DW$246 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R14_b1") - 2678 .dwattr $C$DW$246, DW_AT_location[DW_OP_regx 0x39] - 2679$C$DW$247 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R14_b2") - 2680 .dwattr $C$DW$247, DW_AT_location[DW_OP_regx 0x3a] - 2681$C$DW$248 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R14_b3") - 2682 .dwattr $C$DW$248, DW_AT_location[DW_OP_regx 0x3b] - 2683$C$DW$249 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R15_b0") - 2684 .dwattr $C$DW$249, DW_AT_location[DW_OP_regx 0x3c] - 2685$C$DW$250 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R15_b1") - 2686 .dwattr $C$DW$250, DW_AT_location[DW_OP_regx 0x3d] - 2687$C$DW$251 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R15_b2") - 2688 .dwattr $C$DW$251, DW_AT_location[DW_OP_regx 0x3e] - 2689$C$DW$252 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R15_b3") - 2690 .dwattr $C$DW$252, DW_AT_location[DW_OP_regx 0x3f] - 2691$C$DW$253 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R16_b0") - 2692 .dwattr $C$DW$253, DW_AT_location[DW_OP_regx 0x40] - 2693$C$DW$254 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R16_b1") - 2694 .dwattr $C$DW$254, DW_AT_location[DW_OP_regx 0x41] - 2695$C$DW$255 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R16_b2") -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 50 - - 2696 .dwattr $C$DW$255, DW_AT_location[DW_OP_regx 0x42] - 2697$C$DW$256 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R16_b3") - 2698 .dwattr $C$DW$256, DW_AT_location[DW_OP_regx 0x43] - 2699$C$DW$257 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R17_b0") - 2700 .dwattr $C$DW$257, DW_AT_location[DW_OP_regx 0x44] - 2701$C$DW$258 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R17_b1") - 2702 .dwattr $C$DW$258, DW_AT_location[DW_OP_regx 0x45] - 2703$C$DW$259 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R17_b2") - 2704 .dwattr $C$DW$259, DW_AT_location[DW_OP_regx 0x46] - 2705$C$DW$260 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R17_b3") - 2706 .dwattr $C$DW$260, DW_AT_location[DW_OP_regx 0x47] - 2707$C$DW$261 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R18_b0") - 2708 .dwattr $C$DW$261, DW_AT_location[DW_OP_regx 0x48] - 2709$C$DW$262 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R18_b1") - 2710 .dwattr $C$DW$262, DW_AT_location[DW_OP_regx 0x49] - 2711$C$DW$263 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R18_b2") - 2712 .dwattr $C$DW$263, DW_AT_location[DW_OP_regx 0x4a] - 2713$C$DW$264 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R18_b3") - 2714 .dwattr $C$DW$264, DW_AT_location[DW_OP_regx 0x4b] - 2715$C$DW$265 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R19_b0") - 2716 .dwattr $C$DW$265, DW_AT_location[DW_OP_regx 0x4c] - 2717$C$DW$266 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R19_b1") - 2718 .dwattr $C$DW$266, DW_AT_location[DW_OP_regx 0x4d] - 2719$C$DW$267 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R19_b2") - 2720 .dwattr $C$DW$267, DW_AT_location[DW_OP_regx 0x4e] - 2721$C$DW$268 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R19_b3") - 2722 .dwattr $C$DW$268, DW_AT_location[DW_OP_regx 0x4f] - 2723$C$DW$269 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R20_b0") - 2724 .dwattr $C$DW$269, DW_AT_location[DW_OP_regx 0x50] - 2725$C$DW$270 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R20_b1") - 2726 .dwattr $C$DW$270, DW_AT_location[DW_OP_regx 0x51] - 2727$C$DW$271 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R20_b2") - 2728 .dwattr $C$DW$271, DW_AT_location[DW_OP_regx 0x52] - 2729$C$DW$272 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R20_b3") - 2730 .dwattr $C$DW$272, DW_AT_location[DW_OP_regx 0x53] - 2731$C$DW$273 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R21_b0") - 2732 .dwattr $C$DW$273, DW_AT_location[DW_OP_regx 0x54] - 2733$C$DW$274 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R21_b1") - 2734 .dwattr $C$DW$274, DW_AT_location[DW_OP_regx 0x55] - 2735$C$DW$275 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R21_b2") - 2736 .dwattr $C$DW$275, DW_AT_location[DW_OP_regx 0x56] - 2737$C$DW$276 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R21_b3") - 2738 .dwattr $C$DW$276, DW_AT_location[DW_OP_regx 0x57] - 2739$C$DW$277 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R22_b0") - 2740 .dwattr $C$DW$277, DW_AT_location[DW_OP_regx 0x58] - 2741$C$DW$278 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R22_b1") - 2742 .dwattr $C$DW$278, DW_AT_location[DW_OP_regx 0x59] - 2743$C$DW$279 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R22_b2") - 2744 .dwattr $C$DW$279, DW_AT_location[DW_OP_regx 0x5a] - 2745$C$DW$280 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R22_b3") - 2746 .dwattr $C$DW$280, DW_AT_location[DW_OP_regx 0x5b] - 2747$C$DW$281 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R23_b0") - 2748 .dwattr $C$DW$281, DW_AT_location[DW_OP_regx 0x5c] - 2749$C$DW$282 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R23_b1") - 2750 .dwattr $C$DW$282, DW_AT_location[DW_OP_regx 0x5d] -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 51 - - 2751$C$DW$283 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R23_b2") - 2752 .dwattr $C$DW$283, DW_AT_location[DW_OP_regx 0x5e] - 2753$C$DW$284 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R23_b3") - 2754 .dwattr $C$DW$284, DW_AT_location[DW_OP_regx 0x5f] - 2755$C$DW$285 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R24_b0") - 2756 .dwattr $C$DW$285, DW_AT_location[DW_OP_regx 0x60] - 2757$C$DW$286 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R24_b1") - 2758 .dwattr $C$DW$286, DW_AT_location[DW_OP_regx 0x61] - 2759$C$DW$287 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R24_b2") - 2760 .dwattr $C$DW$287, DW_AT_location[DW_OP_regx 0x62] - 2761$C$DW$288 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R24_b3") - 2762 .dwattr $C$DW$288, DW_AT_location[DW_OP_regx 0x63] - 2763$C$DW$289 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R25_b0") - 2764 .dwattr $C$DW$289, DW_AT_location[DW_OP_regx 0x64] - 2765$C$DW$290 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R25_b1") - 2766 .dwattr $C$DW$290, DW_AT_location[DW_OP_regx 0x65] - 2767$C$DW$291 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R25_b2") - 2768 .dwattr $C$DW$291, DW_AT_location[DW_OP_regx 0x66] - 2769$C$DW$292 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R25_b3") - 2770 .dwattr $C$DW$292, DW_AT_location[DW_OP_regx 0x67] - 2771$C$DW$293 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R26_b0") - 2772 .dwattr $C$DW$293, DW_AT_location[DW_OP_regx 0x68] - 2773$C$DW$294 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R26_b1") - 2774 .dwattr $C$DW$294, DW_AT_location[DW_OP_regx 0x69] - 2775$C$DW$295 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R26_b2") - 2776 .dwattr $C$DW$295, DW_AT_location[DW_OP_regx 0x6a] - 2777$C$DW$296 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R26_b3") - 2778 .dwattr $C$DW$296, DW_AT_location[DW_OP_regx 0x6b] - 2779$C$DW$297 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R27_b0") - 2780 .dwattr $C$DW$297, DW_AT_location[DW_OP_regx 0x6c] - 2781$C$DW$298 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R27_b1") - 2782 .dwattr $C$DW$298, DW_AT_location[DW_OP_regx 0x6d] - 2783$C$DW$299 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R27_b2") - 2784 .dwattr $C$DW$299, DW_AT_location[DW_OP_regx 0x6e] - 2785$C$DW$300 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R27_b3") - 2786 .dwattr $C$DW$300, DW_AT_location[DW_OP_regx 0x6f] - 2787$C$DW$301 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R28_b0") - 2788 .dwattr $C$DW$301, DW_AT_location[DW_OP_regx 0x70] - 2789$C$DW$302 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R28_b1") - 2790 .dwattr $C$DW$302, DW_AT_location[DW_OP_regx 0x71] - 2791$C$DW$303 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R28_b2") - 2792 .dwattr $C$DW$303, DW_AT_location[DW_OP_regx 0x72] - 2793$C$DW$304 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R28_b3") - 2794 .dwattr $C$DW$304, DW_AT_location[DW_OP_regx 0x73] - 2795$C$DW$305 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R29_b0") - 2796 .dwattr $C$DW$305, DW_AT_location[DW_OP_regx 0x74] - 2797$C$DW$306 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R29_b1") - 2798 .dwattr $C$DW$306, DW_AT_location[DW_OP_regx 0x75] - 2799$C$DW$307 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R29_b2") - 2800 .dwattr $C$DW$307, DW_AT_location[DW_OP_regx 0x76] - 2801$C$DW$308 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R29_b3") - 2802 .dwattr $C$DW$308, DW_AT_location[DW_OP_regx 0x77] - 2803$C$DW$309 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R30_b0") - 2804 .dwattr $C$DW$309, DW_AT_location[DW_OP_regx 0x78] - 2805$C$DW$310 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R30_b1") -PRU Assembler Unix v2.1.5 Fri Jun 5 14:14:07 2020 - -Tools Copyright (c) 2012-2017 Texas Instruments Incorporated -/tmp/cloud9-examples/cycle.pru0.asm PAGE 52 - - 2806 .dwattr $C$DW$310, DW_AT_location[DW_OP_regx 0x79] - 2807$C$DW$311 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R30_b2") - 2808 .dwattr $C$DW$311, DW_AT_location[DW_OP_regx 0x7a] - 2809$C$DW$312 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R30_b3") - 2810 .dwattr $C$DW$312, DW_AT_location[DW_OP_regx 0x7b] - 2811$C$DW$313 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R31_b0") - 2812 .dwattr $C$DW$313, DW_AT_location[DW_OP_regx 0x7c] - 2813$C$DW$314 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R31_b1") - 2814 .dwattr $C$DW$314, DW_AT_location[DW_OP_regx 0x7d] - 2815$C$DW$315 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R31_b2") - 2816 .dwattr $C$DW$315, DW_AT_location[DW_OP_regx 0x7e] - 2817$C$DW$316 .dwtag DW_TAG_TI_assign_register, DW_AT_name("R31_b3") - 2818 .dwattr $C$DW$316, DW_AT_location[DW_OP_regx 0x7f] - 2819 .dwendtag $C$DW$CU - 2820 - -No Assembly Errors, No Assembly Warnings diff --git a/books/pru-cookbook/07more/code/delay-test.pru0.c b/books/pru-cookbook/07more/code/delay-test.pru0.c deleted file mode 100644 index 9061e256..00000000 --- a/books/pru-cookbook/07more/code/delay-test.pru0.c +++ /dev/null @@ -1,28 +0,0 @@ -// Shows how to call an assembly routine with one parameter -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" - -// The function is defined in delay.asm in same dir -// We just need to add a declaration here, the definition can be -// separately linked -extern void my_delay_cycles(uint32_t); - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - uint32_t gpio = P9_31; // Select which pin to toggle.; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - while(1) { - __R30 |= gpio; // Set the GPIO pin to 1 - my_delay_cycles(1); - __R30 &= ~gpio; // Clear the GPIO pin - my_delay_cycles(1); - } -} diff --git a/books/pru-cookbook/07more/code/delay-test2.pru0.c b/books/pru-cookbook/07more/code/delay-test2.pru0.c deleted file mode 100644 index 7830ab9a..00000000 --- a/books/pru-cookbook/07more/code/delay-test2.pru0.c +++ /dev/null @@ -1,32 +0,0 @@ -// Shows how to call an assembly routine with a return value -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" - -#define TEST 100 - -// The function is defined in delay.asm in same dir -// We just need to add a declaration here, the definition can be -// separately linked -extern uint32_t my_delay_cycles(uint32_t); - -uint32_t ret; - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - uint32_t gpio = P9_31; // Select which pin to toggle.; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - while(1) { - __R30 |= gpio; // Set the GPIO pin to 1 - ret = my_delay_cycles(1); - __R30 &= ~gpio; // Clear the GPIO pin - ret = my_delay_cycles(1); - } -} diff --git a/books/pru-cookbook/07more/code/delay.pru0.asm b/books/pru-cookbook/07more/code/delay.pru0.asm deleted file mode 100644 index 1c1cce7d..00000000 --- a/books/pru-cookbook/07more/code/delay.pru0.asm +++ /dev/null @@ -1,9 +0,0 @@ -; This is an example of how to call an assembly routine from C. -; Mark A. Yoder, 9-July-2018 - .global my_delay_cycles -my_delay_cycles: -delay: - sub r14, r14, 1 ; The first argument is passed in r14 - qbne delay, r14, 0 - - jmp r3.w2 ; r3 contains the return address \ No newline at end of file diff --git a/books/pru-cookbook/07more/code/delay2.pru0.asm b/books/pru-cookbook/07more/code/delay2.pru0.asm deleted file mode 100644 index a66aa74d..00000000 --- a/books/pru-cookbook/07more/code/delay2.pru0.asm +++ /dev/null @@ -1,15 +0,0 @@ -; This is an example of how to call an assembly routine from C with a return value. -; Mark A. Yoder, 9-July-2018 - - .cdecls "delay-test2.pru0.c" - - .global my_delay_cycles -my_delay_cycles: -delay: - sub r14, r14, 1 ; The first argument is passed in r14 - qbne delay, r14, 0 - - ldi r14, TEST ; TEST is defined in delay-test2.c - ; r14 is the return register - - jmp r3.w2 ; r3 contains the return address \ No newline at end of file diff --git a/books/pru-cookbook/07more/code/logic.c b/books/pru-cookbook/07more/code/logic.c deleted file mode 100644 index f774708d..00000000 --- a/books/pru-cookbook/07more/code/logic.c +++ /dev/null @@ -1,34 +0,0 @@ -// Access the CYCLE and STALL registers -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - // Copy lower 8 bits to r16 - struct { - uint8_t b0; - uint8_t b1; - uint8_t b2; - uint8_t b3; - } r17; - - // Clear SYSCFG[STANDBY_INIT] to enable OCP master port - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - -// r16.b0 = __R31.b0; - __asm(" mov r17.b0, r31.b0"); - __delay_cycles(1); - r17.b1 = (uint32_t) __R31; - __delay_cycles(1); - r17.b2 = (uint32_t) __R31; - __delay_cycles(1); - r17.b3 = (uint32_t) __R31; - - __xout(10, 16, 0, r17); - - __halt(); -} diff --git a/books/pru-cookbook/07more/code/logic_setup.sh b/books/pru-cookbook/07more/code/logic_setup.sh deleted file mode 100644 index 2253459c..00000000 --- a/books/pru-cookbook/07more/code/logic_setup.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash -# -export PRUN=0 -export TARGET=logic -echo PRUN=$PRUN -echo TARGET=$TARGET - -# Configure the PRU pins based on which Beagle is running -machine=$(awk '{print $NF}' /proc/device-tree/model) -echo -n $machine -if [ $machine = "Black" ]; then - echo " Found" - pins="P9_31 P9_29 P9_30 P9_28 P9_92 P9_27 P9_91 P9_25 " -elif [ $machine = "Blue" ]; then - echo " Found" - pins="" -elif [ $machine = "PocketBeagle" ]; then - echo " Found" - pins="P1_36 P1_33 P2_32 P2_30 P1_31 P2_34 P2_28 P1_29" -else - echo " Not Found" - pins="" -fi - -for pin in $pins -do - echo $pin - config-pin $pin pruin - config-pin -q $pin -done diff --git a/books/pru-cookbook/07more/code/resource_table_pru0.h b/books/pru-cookbook/07more/code/resource_table_pru0.h deleted file mode 100644 index 06c14800..00000000 --- a/books/pru-cookbook/07more/code/resource_table_pru0.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ - * - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Texas Instruments Incorporated nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * ======== rsc_table_pru.h ======== - * - * Define the resource table entries for PRU0. This will be - * incorporated into corresponding base images, and used by the remoteproc - * on the host-side to allocated/reserve resources. Note the remoteproc - * driver requires that all PRU firmware be built with a resource table. - * - * - */ - -#ifndef _RSC_TABLE_PRU_H_ -#define _RSC_TABLE_PRU_H_ - -#include <stddef.h> -#include <rsc_types.h> -#include "pru_virtio_ids.h" - -/* - * Sizes of the virtqueues (expressed in number of buffers supported, - * and must be power of 2) - */ -#define PRU_RPMSG_VQ0_SIZE 2 -#define PRU_RPMSG_VQ1_SIZE 2 - -/* flip up bits whose indices represent features we support */ -#define RPMSG_PRU_C0_FEATURES 1 - -/* Definition for unused interrupts */ -#define HOST_UNUSED 255 - -/* Mapping sysevts to a channel. Each pair contains a sysevt, channel */ -struct ch_map pru_intc_map[] = { {17, 1}, {18, 0}, {19, 2}, {20, 3}, {21, 0}, - {22, 1}, {24, 4}, {25, 5}, {26, 6}, {27, 7}, -}; - -struct my_resource_table { - struct resource_table base; - - uint32_t offset[1]; /* Should match 'num' in actual definition */ - - /* intc definition */ - struct fw_rsc_custom pru_ints; -}; - -#pragma DATA_SECTION(am335x_pru_remoteproc_ResourceTable, ".resource_table") -#pragma RETAIN(am335x_pru_remoteproc_ResourceTable) -struct my_resource_table am335x_pru_remoteproc_ResourceTable = { - 1, /* we're the first version that implements this */ - 1, /* number of entries in the table */ - 0, 0, /* reserved, must be zero */ - /* offsets to entries */ - { - offsetof(struct my_resource_table, pru_ints), - }, - - { - TYPE_CUSTOM, TYPE_PRU_INTS, - sizeof(struct fw_rsc_custom_ints), - { /* PRU_INTS version */ - 0x0000, - /* Channel-to-host mapping, 255 for unused */ - 0, 1, 2, 3, 0, 6, 1, 7, HOST_UNUSED, HOST_UNUSED, - /* Number of evts being mapped to channels */ - (sizeof(pru_intc_map) / sizeof(struct ch_map)), - /* Pointer to the structure containing mapped events */ - pru_intc_map, - }, - }, -}; - -#endif /* _RSC_TABLE_PRU_H_ */ diff --git a/books/pru-cookbook/07more/code/setup.sh b/books/pru-cookbook/07more/code/setup.sh deleted file mode 100644 index f1d0d9db..00000000 --- a/books/pru-cookbook/07more/code/setup.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash -# -export TARGET=delay-test.pru0 -export TARGETasm=delay.pru0 -echo TARGET=$TARGET -echo TARGETasm=$TARGETasm - -# Configure the PRU pins based on which Beagle is running -machine=$(awk '{print $NF}' /proc/device-tree/model) -echo -n $machine -if [ $machine = "Black" ]; then - echo " Found" - pins="P9_31" -elif [ $machine = "Blue" ]; then - echo " Found" - pins="" -elif [ $machine = "PocketBeagle" ]; then - echo " Found" - pins="P1_33" -else - echo " Not Found" - pins="" -fi - -for pin in $pins -do - echo $pin - config-pin $pin pruout - config-pin -q $pin -done diff --git a/books/pru-cookbook/07more/code/xin.pru1.c b/books/pru-cookbook/07more/code/xin.pru1.c deleted file mode 100644 index 56d4a682..00000000 --- a/books/pru-cookbook/07more/code/xin.pru1.c +++ /dev/null @@ -1,34 +0,0 @@ -// From: http://git.ti.com/pru-software-support-package/pru-software-support-package/trees/master/examples/am335x/PRU_Direct_Connect1 -#include <stdint.h> -#include "resource_table_empty.h" - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -typedef struct { - uint32_t reg5; - uint32_t reg6; - uint32_t reg7; - uint32_t reg8; - uint32_t reg9; - uint32_t reg10; -} bufferData; - -bufferData dmemBuf; - -/* PRU-to-ARM interrupt */ -#define PRU1_PRU0_INTERRUPT (18) -#define PRU1_ARM_INTERRUPT (20+16) - -void main(void) -{ - /* Let PRU0 know that I am awake */ - __R31 = PRU1_PRU0_INTERRUPT+16; - - /* XFR registers R5-R10 from PRU0 to PRU1 */ - /* 14 is the device_id that signifies a PRU to PRU transfer */ - __xin(14, 5, 0, dmemBuf); - - /* Halt the PRU core */ - __halt(); -} diff --git a/books/pru-cookbook/07more/code/xout-cycle.pru0.c b/books/pru-cookbook/07more/code/xout-cycle.pru0.c deleted file mode 100644 index 339fedfc..00000000 --- a/books/pru-cookbook/07more/code/xout-cycle.pru0.c +++ /dev/null @@ -1,62 +0,0 @@ -// Version of xout.c with code to use CYCLE to count cycle times. -#include <stdint.h> -#include <pru_intc.h> -#include <pru_ctrl.h> -#include "resource_table_pru0.h" - -#define PRU0 - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -typedef struct { - uint32_t reg5; - uint32_t reg6; - uint32_t reg7; - uint32_t reg8; - uint32_t reg9; - uint32_t reg10; -} bufferData; - -bufferData dmemBuf; - -/* PRU-to-ARM interrupt */ -#define PRU1_PRU0_INTERRUPT (18) -#define PRU0_ARM_INTERRUPT (19+16) - -void main(void) -{ - uint32_t cycleXX; // Use a name that's easy to search - /* Clear the status of all interrupts */ - CT_INTC.SECR0 = 0xFFFFFFFF; - CT_INTC.SECR1 = 0xFFFFFFFF; - - /* Load the buffer with default values to transfer */ - dmemBuf.reg5 = 0xDEADBEEF; - dmemBuf.reg6 = 0xAAAAAAAA; - dmemBuf.reg7 = 0x12345678; - dmemBuf.reg8 = 0xBBBBBBBB; - dmemBuf.reg9 = 0x87654321; - dmemBuf.reg10 = 0xCCCCCCCC; - - /* Poll until R31.30 (PRU0 interrupt) is set - * This signals PRU1 is initialized */ - while ((__R31 & (1<<30)) == 0) { - } - - /* XFR registers R5-R10 from PRU0 to PRU1 */ - /* 14 is the device_id that signifies a PRU to PRU transfer */ - PRU0_CTRL.CTRL_bit.CTR_EN = 1; // Enable cycle counter - - __xout(14, 5, 0, dmemBuf); - - cycleXX = PRU0_CTRL.CYCLE; // Read cycle and store in a register - - /* Clear the status of the interrupt */ - CT_INTC.SICR = PRU1_PRU0_INTERRUPT; - - dmemBuf.reg5 = cycleXX; - - /* Halt the PRU core */ - __halt(); -} diff --git a/books/pru-cookbook/07more/code/xout.pru0.c b/books/pru-cookbook/07more/code/xout.pru0.c deleted file mode 100644 index bfcdbf5f..00000000 --- a/books/pru-cookbook/07more/code/xout.pru0.c +++ /dev/null @@ -1,52 +0,0 @@ -// From: http://git.ti.com/pru-software-support-package/pru-software-support-package/trees/master/examples/am335x/PRU_Direct_Connect0 -#include <stdint.h> -#include <pru_intc.h> -#include "resource_table_pru0.h" - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -typedef struct { - uint32_t reg5; - uint32_t reg6; - uint32_t reg7; - uint32_t reg8; - uint32_t reg9; - uint32_t reg10; -} bufferData; - -bufferData dmemBuf; - -/* PRU-to-ARM interrupt */ -#define PRU1_PRU0_INTERRUPT (18) -#define PRU0_ARM_INTERRUPT (19+16) - -void main(void) -{ - /* Clear the status of all interrupts */ - CT_INTC.SECR0 = 0xFFFFFFFF; - CT_INTC.SECR1 = 0xFFFFFFFF; - - /* Load the buffer with default values to transfer */ - dmemBuf.reg5 = 0xDEADBEEF; - dmemBuf.reg6 = 0xAAAAAAAA; - dmemBuf.reg7 = 0x12345678; - dmemBuf.reg8 = 0xBBBBBBBB; - dmemBuf.reg9 = 0x87654321; - dmemBuf.reg10 = 0xCCCCCCCC; - - /* Poll until R31.30 (PRU0 interrupt) is set - * This signals PRU1 is initialized */ - while ((__R31 & (1<<30)) == 0) { - } - - /* XFR registers R5-R10 from PRU0 to PRU1 */ - /* 14 is the device_id that signifies a PRU to PRU transfer */ - __xout(14, 5, 0, dmemBuf); - - /* Clear the status of the interrupt */ - CT_INTC.SICR = PRU1_PRU0_INTERRUPT; - - /* Halt the PRU core */ - __halt(); -} diff --git a/books/pru-cookbook/07more/code/xout_run.sh b/books/pru-cookbook/07more/code/xout_run.sh deleted file mode 100755 index 158cf472..00000000 --- a/books/pru-cookbook/07more/code/xout_run.sh +++ /dev/null @@ -1,3 +0,0 @@ -# Be sure to start PRU 0 before PRU 1. PRU 0 will wait for PRU 1 to signal it. -make TARGET=xout.pru0 -make TARGET=xin.pru1 diff --git a/books/pru-cookbook/07more/more.rst b/books/pru-cookbook/07more/more.rst index 5965b10d..5f24de08 100644 --- a/books/pru-cookbook/07more/more.rst +++ b/books/pru-cookbook/07more/more.rst @@ -43,37 +43,37 @@ constant. Our new ``delay_cycles`` can take a runtime delay value. .. _more_delay-test: -.. literalinclude:: code/delay-test.pru0.c +.. literalinclude:: ../code/07more/delay-test.pru0.c :caption: delay-test.pru0.c :linenos: -:download:`delay-test.pru0.c <code/delay-test.pru0.c>` +:download:`delay-test.pru0.c <../code/07more/delay-test.pru0.c>` :ref:`more_delay` is the assembly code. .. _more_delay: -.. literalinclude:: code/delay.pru0.asm +.. literalinclude:: ../code/07more/delay.pru0.asm :caption: delay.pru0.asm :linenos: -:download:`delay.pru0.asm <code/delay.pru0.asm>` +:download:`delay.pru0.asm <../code/07more/delay.pru0.asm>` The ``Makefile`` has one addition that needs to be made to compile both :ref:`more_delay-test` and :ref:`more_delay`. If you look in the local ``Makefile`` you'll see: .. _more_makefile: -.. literalinclude:: code/Makefile +.. literalinclude:: ../code/07more/Makefile :caption: Makefile :linenos: -:download:`Makefile <code/Makefile>` +:download:`Makefile <../code/07more/Makefile>` This Makefle includes a common Makefile at ``/var/lib/cloud9/common/Makefile``, this the Makefile you need to edit. Edit ``/var/lib/cloud9/common/Makefile`` and go to line 195. -.. code-block:: bash +.. code-block:: shell-session $(GEN_DIR)/%.out: $(GEN_DIR)/%.o *$(GEN_DIR)/$(TARGETasm).o* @mkdir -p $(GEN_DIR) @@ -87,10 +87,10 @@ this addition once you are done with this example since it will break the other The following will compile and run everything. -.. code-block:: bash +.. code-block:: shell-session - bone$ *config-pin P9_31 pruout* - bone$ *make TARGET=delay-test.pru0 TARGETasm=delay.pru0* + bone$ config-pin P9_31 pruout + bone$ make TARGET=delay-test.pru0 TARGETasm=delay.pru0 /var/lib/cloud9/common/Makefile:29: MODEL=TI_AM335x_BeagleBone_Black,TARGET=delay-test.pru0 - Stopping PRU 0 - copying firmware file /tmp/cloud9-examples/delay-test.pru0.out to /lib/firmware/am335x-pru0-fw @@ -166,21 +166,21 @@ Solution .. _more_test2: -.. literalinclude:: code/delay-test2.pru0.c +.. literalinclude:: ../code/07more/delay-test2.pru0.c :caption: delay-test2.pru0.c :linenos: -:download:`delay-test2.pru0.c <code/delay-test2.pru0.c>` +:download:`delay-test2.pru0.c <../code/07more/delay-test2.pru0.c>` :ref:`more_delay2` is the assembly code. .. _more_delay2: -.. literalinclude:: code/delay2.pru0.asm +.. literalinclude:: ../code/07more/delay2.pru0.asm :caption: delay2.pru0.asm :linenos: -:download:`delay2.pru0.asm <code/delay2.pru0.asm>` +:download:`delay2.pru0.asm <../code/07more/delay2.pru0.asm>` An additional feature is shown in line 4 of :ref:`more_delay2`. The ``.cdecls "delay-test2.pru0.c"`` says to include any defines from ``delay-test2.pru0.c`` @@ -206,11 +206,11 @@ many times the PRU stalled fetching an instruction. .. _more_cycle: -.. literalinclude:: code/cycle.pru0.c +.. literalinclude:: ../code/07more/cycle.pru0.c :caption: cycle.pru0.c - Code to count cycles. :linenos: -:download:`cycle.pru0.c <code/cycle.pru0.c>` +:download:`cycle.pru0.c <../code/07more/cycle.pru0.c>` Discission ------------ @@ -244,26 +244,26 @@ You can see where ``cycle`` and ``stall`` are stored by looking into :ref:`more_ .. _more_cycle_list0: -.. literalinclude:: code/cycle.pru0.lst +.. literalinclude:: ../code/07more/cycle.pru0.lst :caption: /tmp/cloud9-examples/cycle.pru0.lst Lines 113..119 :lines: 113-119 :lineno-start: 113 :linenos: -:download:`cycle.pru0.lst <code/cycle.pru0.lst>` +:download:`cycle.pru0.lst <../code/07more/cycle.pru0.lst>` Here the ``LDI32`` instruction loads the address ``0x22000`` into ``r0``. This is the offset to the ``CTRL`` registers. Later in the file we see :ref:`more_cycle_list1`. .. _more_cycle_list1: -.. literalinclude:: code/cycle.pru0.lst +.. literalinclude:: ../code/07more/cycle.pru0.lst :caption: /tmp/cloud9-examples/cycle.pru0.lst Lines 146..152 :lines: 146-152 :lineno-start: 146 :linenos: -:download:`cycle.pru0.lst <code/cycle.pru0.lst>` +:download:`cycle.pru0.lst <../code/07more/cycle.pru0.lst>` The first ``LBBO`` takes the contents of ``r0`` and adds the offset 12 to it and copies 4 bytes @@ -274,10 +274,10 @@ thus ``STALL`` is now in ``r0``. Now fire up **prudebug** and look at those registers. -.. code-block:: bash +.. code-block:: shell-session - bone$ *sudo prudebug* - PRU0> *r* + bone$ sudo prudebug + PRU0> r r r Register info for PRU0 @@ -319,28 +319,28 @@ The ``pass:[__]xout()`` and ``pass:[__]xin()`` intrinsics are able to transfer u .. _more_xout: -.. literalinclude:: code/xout.pru0.c +.. literalinclude:: ../code/07more/xout.pru0.c :caption: xout.pru0.c :linenos: -:download:`xout.pru0.c <code/xout.pru0.c>` +:download:`xout.pru0.c <../code/07more/xout.pru0.c>` PRU 1 waits at line 41 until PRU 0 signals it. :ref:`more_xin` sends an interrupt to PRU 0 and waits for it to send the data. .. _more_xin: -.. literalinclude:: code/xin.pru1.c +.. literalinclude:: ../code/07more/xin.pru1.c :caption: xin.pru1.c :linenos: -:download:`xin.pru1.c <code/xin.pru1.c>` +:download:`xin.pru1.c <../code/07more/xin.pru1.c>` Use ``prudebug`` to see registers R5-R10 are transferred from PRU 0 to PRU 1. -.. code-block:: bash +.. code-block:: shell-session - PRU0> *r* + PRU0> r Register info for PRU0 Control register: 0x00000001 Reset PC:0x0000 STOPPED, FREE_RUN, COUNTER_DISABLED, NOT_SLEEPING, PROC_DISABLED @@ -441,8 +441,8 @@ If you really need speed, considering using ``pass:[__]xout()`` and ``pass:[__]x Copyright ========== -.. literalinclude:: code/copyright.c +.. literalinclude:: ../code/07more/copyright.c :caption: copyright.c :linenos: -:download:`copyright.c <code/copyright.c>` +:download:`copyright.c <../code/07more/copyright.c>` diff --git a/books/pru-cookbook/08ai/ai.rst b/books/pru-cookbook/08ai/ai.rst index d2e055c0..fdf9655e 100644 --- a/books/pru-cookbook/08ai/ai.rst +++ b/books/pru-cookbook/08ai/ai.rst @@ -155,7 +155,7 @@ Solution The ``show-pins.pl`` command does what you want, but you have to set it up first. -.. code-block:: bash +.. code-block:: shell-session bone$ cd ~/bin bone$ ln -s /opt/scripts/device/bone/show-pins.pl . @@ -164,7 +164,7 @@ This creates a symbolic link to the ``show-pins.pl`` command that is rather hidd away. The link is put in the ``bin`` directory which is in the default command ``$PATH``. Now you can run ``show-pins.pl`` from anywhere. -.. code-block:: bash +.. code-block:: shell-session bone$ *show-pins.pl* P9.19a 16 R6 7 fast rx up i2c4_scl @@ -180,7 +180,7 @@ which direction they are set by using ``gpioinfo`` and the chip number. Unfortunately you subtract one from the port number to get the chip number. So ``P8.35b`` is on chip number 2. -.. code-block:: bash +.. code-block:: shell-session bone$ *gpioinfo 2* line 0: unnamed unused *input* active-high @@ -194,7 +194,7 @@ Here we see both (lines 0 and 1) are set to input. Adding ``-v`` gives more details. -.. code-block:: bash +.. code-block:: shell-session bone$ *show-pins.pl -v* ... @@ -210,7 +210,7 @@ Adding ``-v`` gives more details. The best way to use ``show-pins.pl`` is with ``grep``. To see all the pru pins try: -.. code-block:: bash +.. code-block:: shell-session bone$ *show-pins.pl | grep -i pru | sort* P8.13 100 D3 c fast rx pr1_pru1_gpi7 @@ -236,7 +236,7 @@ Problem I want to configure another pin for the PRU, but I get an error. -.. code-block:: bash +.. code-block:: shell-session bone$ *config-pin P9_31 pruout* ERROR: open() for /sys/devices/platform/ocp/ocp:P9_31_pinmux/state failed, No such file or directory @@ -271,14 +271,14 @@ We see that when ``P9_31a`` is set to ``MODE13`` it will be a PRU **out** pin. Next, find which kernel you are running. -.. code-block:: bash +.. code-block:: shell-session bone$ uname -a Linux ai 4.14.108-ti-r131 #1buster SMP PREEMPT Tue Mar 24 19:18:36 UTC 2020 armv7l GNU/Linux I'm running the 4.14 version. Now look in ``/opt/source`` for your kernel. -.. code-block:: bash +.. code-block:: shell-session bone$ cd /opt/source/ bone$ ls @@ -288,9 +288,9 @@ I'm running the 4.14 version. Now look in ``/opt/source`` for your kernel. *dtb-4.14-ti* pyctrl dtb-4.19-ti py-uio -``am5729-beagleboneai.dts`` is the file we need to edit. Search for ``P9_31``. You'l see: +``am5729-beagleboneai.dts`` is the file we need to edit. Search for ``P9_31``. You'll see: -.. code-block:: bash +.. code-block:: shell-session :linenos: DRA7XX_CORE_IOPAD(0x36DC, MUX_MODE14) // B13: P9.30: mcasp1_axr10.off // @@ -301,7 +301,7 @@ Change the ``MUX_MODE14`` to ``MUX_MODE13`` for output, or ``MUX_MODE12`` for in Compile and install. The first time will take a while since it recompiles all the dts files. -.. code-block:: bash +.. code-block:: shell-session :linenos: bone$ make @@ -358,11 +358,11 @@ the adapted code. .. _ai_pwm1: -.. literalinclude:: code/pwm1.pru2_1.c +.. literalinclude:: ../code/08ai/pwm1.pru2_1.c :caption: pwm1.pru2_1.c :linenos: -:download:`pwm1.pru2_1.c <code/pwm1.pru2_1.c>` +:download:`pwm1.pru2_1.c <../code/08ai/pwm1.pru2_1.c>` One line 6 ``P9_31`` is defined as ``(0x1:ref:`10)``, which means shift ``1`` over by 10 bits. diff --git a/books/pru-cookbook/08ai/code/Makefile b/books/pru-cookbook/08ai/code/Makefile deleted file mode 100644 index a7557fda..00000000 --- a/books/pru-cookbook/08ai/code/Makefile +++ /dev/null @@ -1 +0,0 @@ -include /var/lib/cloud9/common/Makefile diff --git a/books/pru-cookbook/08ai/code/pwm1.pru2_1.c b/books/pru-cookbook/08ai/code/pwm1.pru2_1.c deleted file mode 100644 index d35f2185..00000000 --- a/books/pru-cookbook/08ai/code/pwm1.pru2_1.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <stdint.h> -#include <pru_cfg.h> -#include "resource_table_empty.h" -#include "prugpio.h" - -#define P9_31 (0x1<<10) - -volatile register uint32_t __R30; -volatile register uint32_t __R31; - -void main(void) -{ - uint32_t gpio = P9_31; // Select which pin to toggle.; - - /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ - CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; - - while(1) { - __R30 |= gpio; // Set the GPIO pin to 1 - __delay_cycles(100000000); - __R30 &= ~gpio; // Clear the GPIO pin - __delay_cycles(100000000); - } -} diff --git a/books/pru-cookbook/code b/books/pru-cookbook/code new file mode 160000 index 00000000..21a8ba35 --- /dev/null +++ b/books/pru-cookbook/code @@ -0,0 +1 @@ +Subproject commit 21a8ba352d2e6dd793d3029126e6a8c9481eeaf2 diff --git a/books/pru-cookbook/projects.rst b/books/pru-cookbook/projects.rst index 60a2482b..3fbc73fc 100644 --- a/books/pru-cookbook/projects.rst +++ b/books/pru-cookbook/projects.rst @@ -45,8 +45,8 @@ documentation visit the PRU-ICSS wiki. **Type:** Project Tutorial Code Library **References:** - * http://beagleboard.org/CapeContest/entries/BeagleBone+DMX+Cape/ - * http://blog.boxysean.com/2012/08/12/first-steps-with-the-beaglebone-pru/ + * https://beagleboard.org/CapeContest/entries/BeagleBone+DMX+Cape/ + * https://web.archive.org/web/20130921033304/blog.boxysean.com/2012/08/12/first-steps-with-the-beaglebone-pru/ * https://github.com/boxysean/beaglebone-DMX .. dropdown:: **Interacto** @@ -60,8 +60,8 @@ documentation visit the PRU-ICSS wiki. **Type:** Project 1 Project 2 Code Library **References:** - * http://beagleboard.org/CapeContest/entries/Interacto/ - * http://www.hitchhikeree.org/beaglebone_capes/interacto/ + * https://beagleboard.org/CapeContest/entries/Interacto/ + * https://web.archive.org/web/20130507141634/http://www.hitchhikeree.org:80/beaglebone_capes/interacto/ * https://github.com/cclark2/interacto_bbone_cape .. dropdown:: **Replicape: 3D Printer** @@ -100,7 +100,10 @@ documentation visit the PRU-ICSS wiki. **References:** * http://beagleboard.org/CapeContest/entries/Geiger+Cape/ * http://elinux.org/BeagleBone/GeigerCapePrototype - * https://github.com/mranostay/beaglebone-telemetry-presentation + +.. note:: + + #TODO#: the git repo was taken down .. dropdown:: **Servo Controller Foosball Table** :open: @@ -143,10 +146,13 @@ documentation visit the PRU-ICSS wiki. **References:** * http://www.youtube.com/watch?v=dEes9k7-DYY - * https://github.com/cagdasc/Chubby1_v1 * http://www.youtube.com/watch?v=JXyewd98e9Q * http://www.ti.com/lit/wp/spry235/spry235.pdf +.. note:: + + #TODO#: The Chubby1_v1 repo on github.com for user cagdasc was taken down. + .. dropdown:: **Software UART** :open: diff --git a/intro/contribution/git-usage.rst b/intro/contribution/git-usage.rst index 0607ed22..10062fb0 100644 --- a/intro/contribution/git-usage.rst +++ b/intro/contribution/git-usage.rst @@ -581,7 +581,7 @@ There are a lot of different nice guides to using Git on the web: - `Understanding Git Conceptually <https://www.sbf5.com/~cduan/technical/git/>`_ - `git ready: git tips <http://gitready.com/>`_ -- <http://http://cheat.errtheblog.com/s/git> +- https://web.archive.org/web/20121115132047/http://cheat.errtheblog.com/s/git - https://docs.scipy.org/doc/numpy-1.15.1/dev/gitwash/development_workflow.html Numpy is also evaluating git - https://github.github.com/training-kit/downloads/github-git-cheat-sheet diff --git a/intro/support/getting-started.rst b/intro/support/getting-started.rst index 7428e3dc..dd2c78de 100644 --- a/intro/support/getting-started.rst +++ b/intro/support/getting-started.rst @@ -191,7 +191,7 @@ an older operating system or need additional drivers for serial access to older 1. Windows Driver Certification warning may pop up two or three times. Click "Ignore", "Install" or "Run". 2. To check if you're running 32 or 64-bit Windows see `this <https://support.microsoft.com/en-us/topic/determine-whether-your-computer-is-running-a-32-bit-version-or-64-bit-version-of-the-windows-operating-system-1b03ca69-ac5e-4b04-827b-c0c47145944b>`_. - 3. On systems without the latest service release, you may get an error (0xc000007b). In that case, please install the following and retry: https://www.microsoft.com/en-us/download/confirmation.aspx?id=13523 + 3. On systems without the latest service release, you may get an error (0xc000007b). In that case, please perform the following and retry: https://answers.microsoft.com/en-us/windows/forum/all/windows-10-error-code-0xc000007b/02b74e7d-ce19-4ba4-90f0-e16e8d911866 4. You may need to reboot Windows. 5. These drivers have been tested to work up to Windows 10 diff --git a/projects/simppru/examples/read_counter.rst b/projects/simppru/examples/read_counter.rst index 94411118..8177a350 100644 --- a/projects/simppru/examples/read_counter.rst +++ b/projects/simppru/examples/read_counter.rst @@ -18,7 +18,7 @@ Code Explanation ------------ -Since, PRU's hardware counter works at 200 MHz, it counts upto 2 x 108 +Since, PRU's hardware counter works at 200 MHz, it counts up to 2 x 108 cycles in 1 second. So, this can be reliably used to count time without using ``delay``, as we can find exactly how much time 1 cycle takes. -- GitLab