面向AWorks框架和接口的C编程

Size: px
Start display at page:

Download "面向AWorks框架和接口的C编程"

Transcription

1

2

3

4 AWorks Yourdon Constantine BOM AWorks i

5 ARM IP MCU ARM ARM MCU OS PCF85063RX8025T DS1302 RTC FreeRTOS C/OS-II sysbioslinux Windows OS QT emwin GUI MCU MCU OS AWorks OS AWorks OSAWorks AWorks MCU ARM DSP AWorks OS IoT ZLG ZLG ZLG ZLG ZLG +AWorks ZWSZLG Web Services IoT, ii

6 ZLG ZLG 50 ZLG AWorks AMetal C AWorks C AWorks C AMetal LoRa AWorks C++ AWorks GUI AWorks CAN AWorks AWorks EtherCAT iii

7 1 AWorks AWorks OS Cortex-M M105x (M7 ) I/O AW54101 (M4 ) I/O AW412 (M4 ) I/O Cortex-M ARM9&DSP&Cortex-A A280 (ARM9 ) iv

8 I/O AW6748 (DSP ) I/O M28x-T (ARM9 ) I/O M6G2C (A7 ) I/O M3352 (A8 ) I/O ARM9&Cortex-A A280 (ARM9 ) I/O A287 (ARM9 ) I/O A6G2C (A7 ) v

9 I/O A3352 (A8 ) I/O ARM9&Cortex-A i.mx28x (ARM9 ) IoT-3968L (ARM9 ) Cortex-A7 (A7 ) IoT7000A-LI (A7 ) IoT-A3352LI (A8 ) IoT3000A-AWI LED GPIO I/O vi

10 7.1.2 I/O I/O I/O PWM PWM PWM SPI SPI SPI I 2 C I 2 C I 2 C UART UART A/D A/D D/A D/A WDT RTC vii

11 AWBus-lite AWBus-lite AWBus-lite ID AWbus-lite LED LED viii

12 Method LED LED Method Method TPS0xR/T TPS02R TPS02R TPS02R EMM400x EMM400A EMM EMM TPS0xU TPS08U TPS08U TPS08U RTM11AT RS RTM11AT RTM11AT RTM11AT E 2 PROM E 2 PROM NVRAM SPI NOR Flash ix

13 SPI NOR Flash MTD NVRAM RTC RTC RX8025T DS ZLG ZLG ZLG ZLG ZLG ADS131E0x A/D ADS131E ADS131E AD5689R D/A AD5689R AD5689R x

14 ARM AWorks 1

15 1AWorks 1.1 BOM ZLG MCU ARM9 A9 DSP μc/os-iilinux SysBIOS MCU RTOS RTOS SPII 2 CUARTUSBCANModBus 2

16 SDIOWi-Fi NB-IoTLoRa BluetoothzigbeeWLAN 6LoWPANLoRaWANLoRaNet MQTTLwM2MCoAP RAM ROM KB KB MCU OS 5 MCU OS OTA ZLG AWorks 3

17 1.2 AWorks ZLG IoT AWorks 1.1 (a) AWorks AW AWorks ZLG Internet Of Things ZLG IoT AWorks OS 1.1 (b) AWorks MCUZLG i.mx28x C6748 M6G2C M ZLG MCU+ MCU+Wi-Fi MCU+zigbeeMCU+(RFID)MCU MCU+ 4

18 EPC-AW280 A280-W64F8AWIWi-Fi A280-Z64F8AWIzigbee A280-M64F8AWI ZLG Wi-Fi 1.5MicroPortMiniPort 1.5 5

19 AWorks OS AWorks OS 1.6 AWorks OS Shell ModbusTCP/IP GUI AWorks OS AWorks 1.6 AWorks OS AWorks AWorks OS / AWorks OS AWorks OS AWorks AWorks OS AWorks OS AWorksAWorks AWorks OS AWork OS AWorks AWorks AWorks AWorks AWorks AWorks FATYaFFSUFFS MCU AWorks AWorks AWorks AWorks AWorks 1s AWbus-lite 6

20 1024 1K RAM2K ROM OS TCP/IP USB ModBus IoT Wi-FiBluetoothZigbeeGPRS3G4G 6LoWPANTLSDTLSCoAPMQTTLwM2M ZLG μc/ossysbiosfreertos RTOS AWorks LwIPFatFSSQLite AWorks API AWorks MCU OS C AWorks AWorks AWorks 3 1 C C++ 7

21 AWorks PythonMicroPython Python 2 AWorks AWorks PCF85063 TCP/IP AWorks AWorks K AMetal AMetal AMetal 5 &Application Frameworks & LibsBase FacilitiesReal-Time KernelNetworking Device Management (1) &Application Frameworks & Libs GUI Bootloader AWorks Posix Posix AWorks AWorks AWPI C++ ZLG AWPI C++ Posix AWPI AWPI AWPI AWorksWindows Linux Windows Linux C++ AWPI C++ AWorks AWorks IoT C++ C++ (2) AWorks I/O Shell AWorks (3) OS AWorks OS ZLG RTK Real-Time KernelAWorks 8

22 AWorks OS AWorks AWorks SYSBIOS AdaptorWindows AdaptorLinux Adaptor AWorks (4) AWorks IoT AWorks AWorks AWorks ModBus CAN CAN CAN CAN CAN Cellular Wi-FiLoRaWANNB-IoTBluetoothzigbee AWorks TCP/IP IPv6 TLS TLS TCP/IP FTPSMTPHTTPMQTTCoAPLWM2M AWorks AWorks AWorks AWorks (5) GPIOPWMADCDACI 2 CSPII 2 SCANSerialUSBPCIe 3 AWorks (1) CPU CPU Cortex-M0/3/4/7Coterx-A7/8/9ARM7/9DSP (2) & MCU ADCDACGPIOUARTSPII 2 C IC LM75 EEPROM UART SPI PHY 9

23 1.4.3 AWorks SDK Software Development Kit 1.8 AWorks SDK ADC PWM 1.8 SDK LED0 IO SDK AWorks API API API AWorks SDK SDK ZLG EPC-AW280 A280-W64F8AWIWi-Fi A280-Z64F8AWI zigbee A280-M64F8AWI ZLG AWorks SDK SDK AWorks ZLG SDK SDK SDK API AWorks SDK AWorks AWorks SDK SDK LED led_blinking SDK user_code main.c LED

24 1.1 LED 1 #include "aworks.h" 2 #include "aw_led.h" 3 #include "aw_delay.h" 4 5 int aw_main (void) 6 { 7 while(1) { 8 aw_led_toggle(0); // LED0 9 aw_mdelay(500); // 500ms 10 } 11 } SDK AWorks aw_aw_led_toggle() aw_led.h LEDaw_mdelay() aw_delay.h AWorks aworks.h LED API aw_xxx.h API AWorks LED GPIOPWMSPI OS 6 15 AWorks OS TCP/IPModBusGUI 1.5 AWorks AWorks OS ZLG 11

25 12

26 2Cortex-M ZLG MCU 2.1 M105x (M7 ) MCU 4.0 MCU M105x M105x NXP Cortex-M7 RT105x 528MHz SDRAMNandFlashSPI Flash UARTI 2 CSPICANEthernetUSB SDIO Wi-FiZigbeeLoRaRFID M105x M105x M105x AWorks IoT OS AWorks IoT OS M105x 2.1a 2.1b 13

27 2.1 M7 (M1052-W16F128AWI-TM105x-EV-Board CPUNXP RT105x 528MHz 16MB SDRAM 128MB NandFlash 8MB SPI Flash PMU AWorks SD/MMC U 1 10M/100M 1 SD Card 1 USB2.0 Host1 USB2.0 OTG Wi-FizigbeeLoRa RFID 7 2 CAN 1 I²C 1 SPI JTAG 6 PCB 30mm48mm +5V2% M105x i.mx RT105x SDRAMNandFlashSPI Flash Wi-Fi / zigbee / LoRa / RFID 30mm48mm M

28 2.2 M M105x M105x M WWi-Fi -Zzigbee -LLoRa -MRFID 16F128AWI-T AWorks i.mx RT MHz 512K+16M 128 MB Wi-Fi zigbee LoRa RFID I²C 1 SPI CAN-bus 2 USB 2 1 SD LCD 1 3 M F128AWI-T -? - 15

29 -WWi-Fi-Zzigbee-LLoRa-MRFID 5 M F128AWI-T M1052-W16F128AWI-T M1052-Z16F128AWI-TM1052-L16F128AWI-TM1052-M16F128AWI-T I/O M105x I/O SDK 2.3 J1A1 ~ A60 J2B1 ~ B80 J1 J2 2.3 M105x M105x (J1) / A1 5V_SYS 5V 5V A2 GND GND 0V A3 5V_SYS 5V 5V A4 VDD_SNVS_BAT 3.0V RTC 3.0V -- M9 A5 SEMC_ADDR0 SEMC 3.3V / C2 A6 SEMC_ADDR1 SEMC 3.3V / G1 A7 SEMC_ADDR2 SEMC 3.3V / G3 A8 SEMC_ADDR3 SEMC 3.3V / H1 A9 SEMC_ADDR4 SEMC 3.3V / A6 A10 SEMC_ADDR5 SEMC 3.3V / B6 A11 SEMC_ADDR6 SEMC 3.3V / B1 A12 SEMC_ADDR7 SEMC 3.3V / A5 A13 SEMC_ADDR8 SEMC 3.3V / A4 A14 SEMC_ADDR9 SEMC 3.3V / B2 A15 SEMC_ADDR10 SEMC 3.3V / G2 A16 SEMC_ADDR11 SEMC 3.3V / B4 A17 SEMC_ADDR12 SEMC 3.3V / A3 A18 NC NC NC A19 SEMC_CSX0 SEMC NandFlash 3.3V C7 A20 SEMC_RDY SEMC NandFlash 3.3V A7 A21 GND GND 0V

30 / A22 GND GND 0V A23 SEMC_DATA15 SEMC 3.3V / E4 A24 SEMC_DATA14 SEMC 3.3V / C3 A25 SEMC_DATA13 SEMC 3.3V / E5 A26 SEMC_DATA12 SEMC 3.3V / D4 A27 SEMC_DATA11 SEMC 3.3V / C4 A28 SEMC_DATA10 SEMC 3.3V / D5 A29 SEMC_DATA9 SEMC 3.3V / C5 A30 SEMC_DATA8 SEMC 3.3V / C6 A31 SEMC_DATA7 SEMC 3.3V / H4 A32 SEMC_DATA6 SEMC 3.3V / H5 A33 SEMC_DATA5 SEMC 3.3V / G5 A34 SEMC_DATA4 SEMC 3.3V / F2 A35 SEMC_DATA3 SEMC 3.3V / G4 A36 SEMC_DATA2 SEMC 3.3V / F4 A37 SEMC_DATA1 SEMC 3.3V / F3 A38 SEMC_DATA0 SEMC 3.3V / E3 A39 GND GND 0V A40 WDO_EN WDO 3.3V -- A41 FLEXSPI_A_SS0_B SPI SPI Flash 3.3V L3 A42 WAKEUP GPIO 3.3V L6 A43 FLEXSPI_A_SCLK SPI SPI Flash 3.3V L4 A44 GND GND 0V A45 FLEXSPI_A_DATA0 SPI SPI Flash 3.3V / P3 A46 USDHC1_DATA3 SDIO SDIO1 3.3V / J2 A47 FLEXSPI_A_DATA1 SPI SPI Flash 3.3V / N4 A48 USDHC1_DATA2 SDIO SDIO1 3.3V / H2 A49 FLEXSPI_A_DATA2 SPI SPI Flash 3.3V / P4 A50 USDHC1_DATA1 SDIO SDIO1 3.3V / K1 A51 FLEXSPI_A_DATA3 SPI SPI Flash 3.3V / P5 A52 USDHC1_DATA0 SDIO SDIO1 3.3V / J1 A53 ONOFF ONOFF 3.3V M6 A54 USDHC1_CLK SDIO SDIO1 3.3V J3 A55 nrst_in RESET 3.3V A56 USDHC1_CMD SDIO SDIO1 3.3V J4 A57 SRC_BOOT_MODE0 BOOT 3.3V F11 A58 CCM_CLK1_P NC 3.3V / N13 A59 SRC_BOOT_MODE1 BOOT 3.3V G14 A60 CCM_CLK1_N NC 3.3V / P13 17

31 2.3 M105x (J2) / B1 LCD_ENABLE LCD LCD 3.3V E7 B2 LCD_CLK LCD LCD 3.3V D7 B3 LCD_HSYNC LCD LCD 3.3V E8 B4 LCD_VSYNC LCD LCD 3.3V D8 B5 LCD_DATA0 LCD LCD 3.3V C8 B6 LCD_DATA1 LCD LCD 3.3V B8 B7 LCD_DATA2 LCD LCD 3.3V A8 B8 LCD_DATA3 LCD LCD 3.3V A9 B9 LCD_DATA4 LCD LCD 3.3V B9 B10 LCD_DATA5 LCD LCD 3.3V C9 B11 LCD_DATA6 LCD LCD 3.3V D9 B12 LCD_DATA7 LCD LCD 3.3V A10 B13 LCD_DATA8 LCD LCD 3.3V C10 B14 LCD_DATA9 LCD LCD 3.3V D10 B15 LCD_DATA10 LCD LCD 3.3V E10 B16 LCD_DATA11 LCD LCD 3.3V E11 B17 LCD_DATA12 LCD LCD 3.3V A11 B18 LCD_DATA13 LCD LCD 3.3V B11 B19 LCD_DATA14 LCD LCD 3.3V C11 B20 LCD_DATA15 LCD LCD 3.3V D11 B21 GND GND 0V B22 GND GND 0V B23 ENET_RX_DATA0 ENET 3.3V E12 B24 ENET_RX_DATA1 ENET 3.3V D12 B25 ENET_RX_EN ENET 3.3V C12 B26 ENET_TX_DATA0 ENET 3.3V B12 B27 ENET_TX_DATA1 ENET 3.3V A12 B28 ENET_TX_EN ENET 3.3V A13 B29 ENET_TX_CLK ENET 3.3V B13 B30 ENET_RX_ER ENET 3.3V C13 B31 ENET_MDC ENET 3.3V C14 B32 ENET_MDIO ENET 3.3V / B14 B33 JTAG_TMS JTAG JTAG 3.3V E14 B34 LPI2C1_SCL I 2 C I 2 C1 3.3V J11 B35 JTAG_TCK JTAG JTAG 3.3V F12 B36 LPI2C1_SDA I 2 C I 2 C1 3.3V / K11 B37 JTAG_TDI JTAG JTAG 3.3V F14 B38 LPUART2_RX UART UART2 3.3V M12 B39 JTAG_TRSTB JTAG JTAG 3.3V G10 18

32 / B40 LPUART2_TX UART UART2 3.3V L11 B41 JTAG_TDO JTAG JTAG 3.3V G13 B42 LPUART2_RTS_B UART UART2 3.3V K11 B43 JTAG_MOD JTAG JTAG 3.3V F13 B44 LPUART2_CTS_B UART UART2 3.3V J11 B45 LPUART3_CTS_B UART UART3 3.3V L12 B46 LPUART3_RTS_B UART UART3 3.3V K12 B47 LPUART3_RX UART UART3 3.3V K10 B48 LPUART3_TX UART UART3 3.3V J12 B49 LPUART5_RX UART UART5 3.3V D14 B50 LPUART5_TX UART UART5 3.3V D13 B51 LPUART6_RX UART UART6 3.3V G11 B52 LPUART6_TX UART UART6 3.3V M11 B53 LPUART8_RX UART UART8 3.3V J13 B54 LPUART8_TX UART UART8 3.3V L13 B55 FLEXCAN1_TX CAN CAN1 3.3V H13 B56 FLEXCAN1_RX CAN CAN1 3.3V M13 B57 FLEXCAN2_TX CAN CAN2 3.3V H14 B58 FLEXCAN2_RX CAN CAN2 3.3V L10 B59 GND GND 0V B60 GND GND 0V B61 LPSPI3_SDO SPI SPI3 3.3V G12 B62 USDHC2_CMD SDIO SDIO2 3.3V N3 B63 LPSPI3_PCS0 SPI SPI3 3.3V H12 B64 USDHC2_CLK SDIO SDIO2 3.3V P2 B65 LPSPI3_SCK SPI SPI3 3.3V J14 B66 USDHC2_DATA0 SDIO SDIO2 3.3V / M4 B67 LPSPI3_SDI SPI SPI3 3.3V H11 B68 USDHC2_DATA1 SDIO SDIO 3.3V / M3 B69 LPI2C1_SDAS I 2 C I 2 C1 3.3V / H10 B70 USDHC2_DATA2 SDIO SDIO2 3.3V / M5 B71 USB_OTG1_CHD_B USB USB1 3.3V N12 B72 USDHC2_DATA3 SDIO SDIO2 3.3V / L5 B73 5V_USB_OTG1 USB USB1 VBUS 5V N6 B74 5V_USB_OTG2 USB USB2 VBUS 5V P6 B75 USB_OTG1_DP USB USB1 + 5V / L8 B76 USB_OTG2_DN USB USB2-5V / N7 B77 USB_OTG1_ID USB USB1 ID 3.3V H10 B78 USB_OTG2_DP USB USB2 + 5V / P7 19

33 / B79 GND GND 0V B80 USB_OTG2_ID USB USB2 ID 3.3V M AW54101 (M4 ) AW54101 Wi-Fi ZLG NXP LPC54101 MCU 104KB SRAM512KB Flash Wi-Fi ZW6201 1M 4M SPI Flash PCB UARTSPII 2 C AW54101 AWorks IoT OS AW a AW b AW AW54101 MCUNXP LPC MHz Cortex-M4 SRAM104KB SPI Flash 1M 4M I²C2 ( GPIO) SPI1 ( GPIO) UART3 ( GPIO) 20

34 ADC MSps ADC GPIO30 PWM2 JTAG 3.3V5% 17dBm -90dBm -30~+85 Wi-Fi IEEE802.11b\g\n 4 PCB 18mm36mm AW54101 MCUWi-Fi 2.4GHz 18mm 36mm AW AW AW54101 AW54101WF1P AW54101WF1E AW54101WF4P AW54101WF4E ARM ARM Cortex-M4 ARM Cortex-M4 ARM Cortex-M4 ARM Cortex-M4 ARM 100MHz 100MHz 100MHz 100MHz Flash 512KB+1M 512KB+1M 512KB+4M 512KB+4M Wi-Fi IEEE b\g\n IEEE b\g\n IEEE b\g\n IEEE b\g\n USB SPI UART

35 AW54101WF1P AW54101WF1E AW54101WF4P AW54101WF4E I 2 C ADC PWM GPIO I/O AW54101 I/O SDK AW AW54101 / 1 VDD V 2 VDD POWER -- 3 GND 0 V -- 4 SPI1_MISO 3.3V 5 SPI1_MOSI 3.3V SPI1 6 SPI1_CLK 3.3V 7 SPI1_SSEL1 3.3V 8 U0_TXD 0 3.3V UART0 9 U0_RXD 0 3.3V 10 U2_TXD 2 3.3V 11 U2_RXD 2 3.3V UART2 12 U2_RTS_N IO 3.3V 13 U2_CTS_N IO 3.3V 14 SWCLK SWCLK 3.3V 15 SWDIO SWDIO 3.3V / 16 nrst nrst MCU 3.3V 17 NC NC NC NC GPIO1 IO 3.3V / GPIO 20 GPIO2 IO 3.3V / 21 GPIO3 GPIO IO 3.3V / 22

36 / 22 ADC0_1 ADC 3.3V ADC 23 ADC0_0 ADC 3.3V 24 AGND 0 V -- POWER V_AP 3.3V NC NC NC NC I2C2_SDA I 2 C2 3.3V / I 2 C2 29 I2C2_SCL I 2 C2 3.3V 30 I2C0_SDA I 2 C0 3.3V / I 2 C0 31 I2C0_SCL I 2 C0 3.3V 32 GPIO4 GPIO IO 3.3V / 33 U3_RXD 3 3.3V URAT3 34 U3_TXD 3 3.3V 35 PWM0 3.3V PWM PWM 36 PWM1 3.3V 37 U1_RXD 1 3.3V UART1 38 U1_TXD 1 3.3V 39 GPIO5 GPIO IO 3.3V / 40 GPIO6 GPIO IO 3.3V / 41 GND POWER 0 V GND POWER 0 V NC NC AW412 (M4 ) AW412 ZLG ST Cortex-M4 STM32F KB SRAM1M FLASH Wi-Fi ZW6201 UARTSPII 2 C AW54101 AW412 AWorks IoT OS SDK AW a AW b AW

37 AW412 MCUSTM32F412RGY6 100MHz Cortex-M4 SRAM256KB Flash 1024KB+1M I²C2 ( GPIO) SPI1 ( GPIO) UART3 ( GPIO) bit SAR ADC 1 USB2.0 GPIO30 PWM2 JTAG 3.3V5% 17dBm -90dBm -30~+85 Wi-Fi IEEE802.11b\g\n 4 PCB 18mm36mm AW412 MCUWi-Fi 2.4GHz 18mm36mm

38 2.8 AW AW AW412 AW412WF1P AW412WF1E ARM ARM Cortex-M4 ARM Cortex-M4 ARM 100MHz 100MHz SRAM 256KB 256KB Flash 1024KB+1M 1024KB+1M Wi-Fi IEEE b\g\n IEEE b\g\n USB 1 SPI 1 1 UART 3 3 I 2 C 2 2 ADC 2 2 PWM 2 2 GPIO I/O AW412 I/O SDK 2.9 AW AW412 25

39 2.7 AW412 / 1 VDD V 2 VDD POWER -- 3 GND 0 V -- 4 SPI1_MISO 3.3V 5 SPI1_MOSI 3.3V SPI1 6 SPI1_CLK 3.3V 7 SPI1_SSEL1 3.3V 8 U0_TXD UART V 9 U0_RXD UART V 10 U2_TXD 2 3.3V 11 U2_RXD 2 3.3V UART2 12 U2_RTS_N IO 3.3V 13 U2_CTS_N IO 3.3V 14 SWCLK SWCLK 3.3V 15 SWDIO SWDIO 3.3V / 16 nrst nrst MCU 3.3V 17 NC NC NC NC GPIO1 IO 3.3V / 20 GPIO2 GPIO IO 3.3V / 21 GPIO3 IO 3.3V / 22 ADC0_1 ADC 3.3V ADC 23 ADC0_0 ADC 3.3V 24 AGND 0 V -- POWER V_AP 3.3V NC NC NC NC I2C2_SDA I 2 C2 3.3V / I 2 C2 29 I2C2_SCL I 2 C2 3.3V 30 I2C0_SDA I 2 C0 3.3V / I 2 C0 31 I2C0_SCL I 2 C0 3.3V 32 GPIO4 GPIO IO 3.3V / 33 U3_RXD 3 3.3V URAT3 34 U3_TXD 3 3.3V 35 PWM0 PWM 3.3V PWM 36 PWM1 3.3V 37 U1_RXD 1 3.3V UART1 38 U1_TXD 1 3.3V 39 GPIO5 GPIO IO 3.3V / 40 GPIO6 GPIO IO 3.3V / 26

40 / 41 GND POWER 0 V GND POWER 0 V NC NC Cortex-M (1) AW54101WF1P/E (2) AW54101WF4E/P (3) AW412W1E/P (4) M1051-F8AWI-T (5) M F128AWI-T (6) M1052-W16F128AWI-T (7) M1052-Z16F128AWI-T (8) M1052-L16F128AWI-T (9) M1052-M16F128AWI-T 2.8 Cortex-M AW54101 AW412 M1051 M1052 W W - - -W -Z -L -M F1P/E F4E/P 1E/P F8AWI-T 16F128AWI-T CPU ARM Cortex-M4 ARM Cortex-M7 STM32 CPU LPC54101 F412 RT1051 RT1052 CPU 100MHz 528MHz Flash 512K+ 512K+ 1M 4M 1M+1M 8M 128M 104K 256K 512K 512K+16M AWorks zigbee Wi-Fi RFID LoRa / PCB CAN

41 AW54101 AW412 M1051 M1052 W W - - -W -Z -L -M F1P/E F4E/P 1E/P F8AWI-T 16F128AWI-T UART 3 8 I 2 C 2 1 SPI 1 USB OTG SD LCD RGB CSI I 2 S/SAI PWM 2 4 ADC 2 20 GPIO ~ -30 ~ ~ ~ mm 3048mm 28

42 3ARM9&DSP&Cortex-A ARM9DSPCortex-A SoC MCUDDRNandFlash AWorks 3.1 A280 (ARM9 ) A280 MiniARM AW280-64F8 ZLG SoC NXP ARM9 i.mx28 454MHz DDR2SPI FlashUARTI 2 C I 2 SEthernetUSBSSP PMU A a AW280-64F8 3.1b AW280 (AW280-64F8AW280-EV-Board CPUNXP i.mx28 ARM9 454MHz 64MB DDR2 8MB SPI Flash PMU AWorks TCP/IP SD/MMC U 29

43 2 10M/100M 1 SD Card 1 USB2.0 Host1 USB2.0 OTG 6 2 CAN 2 I²C1 SPI8 12 ADC( 1 ADC) JTAG 6 PCB 30mm48mm 3.3V2% A280 i.mx28 DDR2SPI Flash 30mm 48mm A A A280 AW280-64F8 AW280-64F8 AWorks USB 1 HOST1 OTG ARM i.mx28 6 ARM 454MHz CAN-bus 2 64MB 2 8MB SD 2 zigbee 1 Wi-Fi I²C 2 RFID ADC 8 PWM 8 30

44 3.1.5 I/O A280 I/O SDK 3.3 J1A1 ~ A80 J2B1 ~ B80 J1 J A A280 (J1) / A1 USB_DEV_DET USB Device USB DEVICE 5V E17 A2 3.3V 3.3V 3.3V A3 GND 0V A4 3.3V 3.3V 3.3V A5 ADC0 ADC12 ADC0 428KHz 1.8V C15 A6 GND 0V A7 ADC1 ADC ADC1 428KHz 1.8V C9 A8 JTAG_TRST JTAG JTAG 3.3V D14 A9 ADC6 ADC ADC6 428KHz 1.8V C14 A10 JTAG_RTCK/GPIO 4_20 JTAG JTAG 3.3V E14 A11 HSADC ADC ADC 2MHz 1.8V B14 A12 JTAG_TDO JTAG JTAG 3.3V E13 A13 USB_OTG_ID/GPI O3_18 USB OTG USB OTG / 3.3V K8 A14 JTAG_TCK JTAG JTAG 3.3V E11 A15 USB_OTG_P USB OTG USB OTG P 5V / B10 A16 JTAG_TMS JTAG JTAG 3.3V D12 A17 USB_OTG_N USB OTG USB OTG N 5V / A10 A18 JTAG_TDI JTAG JTAG 3.3V E12 31

45 / USB A19 USB_H_P HOST USB HOST P 5V / A8 A20 GND 0V A21 USB_H_N USB HOST USB HOST N 5V / B8 USB0_ A22 nrst_out DEVICE 3.3V USB HOST 5V A23 BEEP/GPIO3_29 GPIO 3.3V / E10 A24 nrst_in 3.3V A25 ERR/GPIO2_5 SYS ERR 3.3V C5 A26 WDO_EN 3.3V 3.3V RUN A27 RUN/GPIO2_6 SYS 3.3V D5 SYS A28 Factory/GPIO2_4 3.3V / B5 A29 I2C1_SCL/GPIO3_16 I 2 C1 I 2 C1 3.3V K7 A30 I2C0_SCL/GPIO3_24 I 2 C0 I 2 C0 3.3V C7 A31 I2C1_SDA/GPIO3_17 I 2 C1 I 2 C1 3.3V / L7 A32 I2C0_SDA/GPIO3_25 I 2 C0 I 2 C0 3.3V / D8 A33 VDD_XTAL 3.3V C12 A34 GND 0V A35 PSWITCH 1.2V A11 A36 GPIO3_26 GPIO GPIO3_26 3.3V / E8 A37 GPIO3_21 GPIO GPIO3_21 3.3V / G6 A38 AUART4_RX/GPIO3_22 AUART V F7 A39 GPIO3_20 GPIO GPIO3_20 3.3V / G7 A40 AUART4_TX/GPIO3_23 AUART V E7 A41 SD_D0/GPIO2_0 SDIO SDIO 0 3.3V / B6 A42 SD_WP/GPIO0_17 SDIO SDIO 3.3V N9 A43 SD_D1/GPIO2_1 SDIO SDIO 1 3.3V / C6 32

46 / A44 SD_DETECT/GPIO2_9 SDIO SDIO 3.3V D10 A45 SD_D2/GPIO2_2 SDIO SDIO 2 3.3V / D6 A46 SD_SCK/GPIO2_10 SDIO SDIO 3.3V A6 A47 SD_D3/GPIO2_3 SDIO SDIO 3 3.3V / A5 A48 SD_CMD/GPIO2_8 SDIO SDIO 3.3V A4 A49 ENET1_RX_EN/GPIO4_15 NET V J3 A50 GND 0V A51 ENET1_RXD1/GPIO4_10 NET V J2 A52 ENET1_TX_EN/GPIO4_14 NET V J4 A53 ENET1_RXD0/GPIO4_9 NET V J1 A54 ENET1_TXD1/GPIO4_12 NET V G2 A55 ENET0_RX_CLK/GPIO4_13 NET V F3 A56 ENET1_TXD0/GPIO4_11 NET V G1 A57 ENET0_RX_EN/GPIO4_2 NET V E4 A58 ENET0_TX_CLK/GPIO4_5 NET V E3 A59 ENET0_RXD1/GPIO4_4 NET V H2 A60 ENET0_TX_EN/GPIO4_6 NET V F4 A61 ENET0_RXD0/GPIO4_3 NET V H1 A62 ENET0_TXD1/GPIO4_8 NET V F2 A63 ENET_MDIO/GPIO4_1 NET 3.3V / H4 A64 ENET0_TXD0/GPIO4_7 NET V F1 A65 ENET_CLK/GPIO4_16 NET 3.3V E2 A66 ENET_MDC/GPIO4_0 NET 3.3V G4 A67 GND 0V A68 GND 0V A69 GPIO1_30 GPIO GPIO1_30 3.3V / N1 A70 GPIO1_28 GPIO GPIO1_28 3.3V / L1 A71 GPIO1_31 GPIO GPIO1_31 3.3V / N5 A72 GPIO1_29 GPIO GPIO1_29 3.3V / M1 A73 GPIO2_12 GPIO GPIO2_12 3.3V / B1 A74 SPI3_SCK/GPIO2_24 SPI3 SPI3 3.3V A2 A75 GPIO2_13 GPIO GPIO2_13 3.3V / C1 A76 SPI3_MOSI/GPIO2_25 SPI3 SPI3 3.3V / C2 A77 GPIO2_14 GPIO GPIO2_14 3.3V / D1 A78 SPI3_MISO/GPIO2_26 SPI3 SPI3 3.3V B2 A79 GPIO2_15 GPIO GPIO2_15 3.3V / E1 A80 SPI3_SS0/GPIO2_27 SPI3 SPI V / D2 33

47 3.3 A280 (J2) / B1 GPIO0_16 GPIO GPIO0_16 3.3V / N7 B2 GPIO0_7 GPIO GPIO0_7 3.3V / T6 B3 GPIO0_20 GPIO GPIO0_20 3.3V / N6 B4 GPIO0_6 GPIO GPIO0_6 3.3V / U6 B5 GPIO0_21 GPIO GPIO0_21 3.3V / N8 B6 GPIO0_5 GPIO GPIO0_5 3.3V / R7 B7 GPIO0_24 GPIO GPIO0_24 3.3V / R6 B8 GPIO0_4 GPIO GPIO0_4 3.3V / T7 B9 GPIO0_25 GPIO GPIO0_25 3.3V / P8 B10 GPIO0_3 GPIO GPIO0_3 3.3V / U7 B11 GPIO0_26 GPIO GPIO0_26 3.3V / P6 B12 GPIO0_2 GPIO GPIO0_2 3.3V / R8 B13 GPIO0_27 GPIO GPIO0_27 3.3V / P7 B14 GPIO0_1 GPIO GPIO0_1 3.3V / T8 B15 GPIO0_28 GPIO GPIO0_28 3.3V / L9 B16 GPIO0_0 GPIO GPIO0_0 3.3V / U8 B17 GND 0V B18 GND 0V B19 CAN1_TX/GPIO0_18 CAN1 CAN1 3.3V M7 B20 AUART3_TX/GPIO3_13 AUART V L5 B21 CAN1_RX/GPIO0_19 CAN1 CAN1 3.3V M9 B22 AUART3_RX/GPIO3_12 AUART V M5 B23 CAN0_TX/GPIO0_22 CAN0 CAN0 3.3V M8 B24 AUART2_TX/GPIO3_9 AUART V F5 B25 CAN0_RX/GPIO0_23 CAN0 CAN0 3.3V L8 B26 AUART2_RX/GPIO3_8 AUART V F6 B27 GPIO3_15 GPIO GPIO3_15 3.3V / K6 B28 DUART_TX/GPIO3_3 DUART 3.3V J7 B29 GPIO3_14 GPIO GPIO3_14 3.3V / L6 B30 DUART_RX/GPIO3_2 DUART 3.3V J6 B31 GPIO3_11 GPIO GPIO3_11 3.3V / H7 B32 AUART1_TX/GPIO3_5 AUART V K4 B33 GPIO3_10 GPIO GPIO3_10 3.3V / H6 B34 AUART1_RX/GPIO3_4 AUART V L4 B35 GPIO3_7 GPIO GPIO3_7 3.3V / J5 B36 AUART0_TX/GPIO3_1 AUART V H5 B37 GPIO3_6 GPIO GPIO3_6 3.3V / K5 B38 AUART0_RX/GPIO3_0 AUART V G5 B39 GND 0V 34

48 / B40 GND 0V B41 ADC3 ADC 12 ADC3 1.8V D9 B42 ADC5 ADC 12 ADC5 1.8V D15 B43 ADC2 ADC 12 ADC2 1.8V C8 B44 ADC4 ADC 12 ADC4 1.8V D13 B45 GPIO1_27 GPIO GPIO1_27 3.3V / P5 B46 GPIO1_24 GPIO GPIO1_24 3.3V / P4 B47 GPIO1_26 GPIO GPIO1_26 3.3V / M4 B48 GPIO1_25 GPIO GPIO1_25 3.3V / K1 B49 GPIO3_28 GPIO GPIO3_28 3.3V / E9 B50 GPIO3_30 GPIO GPIO3_30 3.3V / M6 B51 GPIO1_23 GPIO GPIO1_23 3.3V / R5 B52 GPIO1_22 GPIO GPIO1_22 3.3V / T5 B53 GPIO1_21 GPIO GPIO1_21 3.3V / U5 B54 GPIO1_20 GPIO GPIO1_20 3.3V / R4 B55 GPIO1_19 GPIO GPIO1_19 3.3V / T4 B56 GPIO1_18 GPIO GPIO1_18 3.3V / U4 B57 GPIO1_17 GPIO GPIO1_17 3.3V / R3 B58 GPIO1_16 GPIO GPIO1_16 3.3V / T3 B59 GPIO1_15 GPIO GPIO1_15 3.3V / U3 B60 GPIO1_14 GPIO GPIO1_14 3.3V / U2 B61 GPIO1_13 GPIO GPIO1_13 3.3V / T2 B62 GPIO1_12 GPIO GPIO1_12 3.3V / T1 B63 GPIO1_11 GPIO GPIO1_11 3.3V / R2 B64 GPIO1_10 GPIO GPIO1_10 3.3V / R1 B65 GPIO1_9 GPIO GPIO1_9 3.3V / P3 B66 GPIO1_8 GPIO GPIO1_8 3.3V / P2 B67 GPIO1_7 GPIO GPIO1_7 3.3V / P1 B68 GPIO1_6 GPIO GPIO1_6 3.3V / N2 B69 GPIO1_5 GPIO GPIO1_5 3.3V / M3 B70 GPIO1_4 GPIO GPIO1_4 3.3V / M2 B71 GPIO1_3 GPIO GPIO1_3 3.3V / L3 B72 GPIO1_2 GPIO GPIO1_2 3.3V / L2 B73 GPIO1_1 GPIO GPIO1_1 3.3V / K3 B74 GPIO1_0 GPIO GPIO1_0 3.3V / K2 B75 GND 0V B76 GND 0V B77 NC NC/ B78 NC 35

49 / B79 NC NC/ B80 NC 3.2 AW6748 (DSP ) AW6748 ZLG DSP TI C6000 DSP TMS320C MHz UARTI 2 CI 2 SSPIUSBEthernet RGB EMIF-A upp AW6748 DDR2NandFlash AWorks 3.4a 3.4b AW6748 CPU TI C6000 DSP TMS320C MHz 64MB/128MB DDR2 128MB NandFlash AWorks 36

50 TCP/IP SD/MMC U 1 10M/100M 2 SD Card 1 USB1.1 HOST1 USB2.0 OTG 2 2 I²C 1 SPI EMIF-A upp LCD JTAG 6 PCB 35mm48mm 5V5% AW6748 DSP TMS320C6748DDR2NandFlash 35mm48mm 3.5 PCB 3.5 AW AW

51 3.4 AW6748 AW AW F128 AWorks AWorks TMS320C6748 TMS320C MHz 375MHz 128MB 64MB 128MB 128MB 16 RGB RGB EMIF-A upp USB 1 OTG1 HOST 1 OTG1 HOST UART I²S 1 1 SPI I²C 1 1 SDIO 2 2 PWM GPIO I/O AW6748 I/O AWorks I/O SDK 3.6 GPIO 3 60Pin 3 AB C SPI Flash SPI FLASH SPI Flash 3.6 AW

52 3.5 AW6748 A / A1 LCD_D0 LCDRGB565 LCD 0 3.3V W1 A2 GPIO6_1 GPIO GPIO6_1 3.3V / K4 A3 LCD_D1 LCDRGB565 LCD 1 3.3V W2 A4 GPIO0_2 GPIO GPIO0_2 3.3V / D4 A5 LCD_D2 LCDRGB565 LCD 2 3.3V W3 A6 GPIO0_1 GPIO GPIO0_1 3.3V / C3 A7 LCD_D3 LCDRGB565 LCD 3 3.3V V1 A8 GPIO1_15 GPIO GPIO1_15 3.3V / D2 A9 LCD_D4 LCDRGB565 LCD 4 3.3V V2 A10 GPIO0_4 GPIO GPIO0_4 3.3V / C4 A11 LCD_D5 LCDRGB565 LCD 0 3.3V V3 A12 GPIO0_12 GPIO GPIO0_12 3.3V / B2 A13 LCD_D6 LCDRGB565 LCD 1 3.3V U1 A14 GPIO0_15 GPIO GPIO0_15 3.3V / A1 A15 LCD_D7 LCDRGB565 LCD 2 3.3V U2 A16 GPIO0_14 GPIO GPIO0_14 3.3V / B1 A17 LCD_D8 LCDRGB565 LCD 3 3.3V U3 A18 GPIO0_13 GPIO GPIO0_13 3.3V / C2 A19 LCD_D9 LCDRGB565 LCD 4 3.3V T1 A20 GPIO0_3 GPIO GPIO0_3 3.3V / C5 A21 LCD_D10 LCDRGB565 LCD 5 3.3V T2 A22 GND GND 0V A23 LCD_D11 LCDRGB565 LCD 0 3.3V T3 A24 SATA_REFCLK_N SATA_REFCLK_N SATA 1.2V N1 A25 LCD_D12 LCDRGB565 LCD 1 3.3V R1 A26 SATA_REFCLK_P SATA_REFCLK_P SATA 1.2V N2 A27 LCD_D13 LCDRGB565 LCD 2 3.3V R2 A28 SATA_TX_N SATA_TX_N SATA 1.2V J2 A29 LCD_D14 LCDRGB565 LCD 3 3.3V R3 A30 SATA_TX_P SATA_TX_P SATA 1.2V J1 A31 LCD_D15 LCDRGB565 LCD 4 3.3V R4 A32 SATA_RX_N SATA_RX_N SATA 1.2V L2 A33 LCD_VSYNC LCD_VSYNC LCD 3.3V G4 A34 SATA_RX_P SATA_RX_P SATA 1.2V L1 A35 LCD_HSYNC LCD_HSYNC LCD 3.3V H4 A36 GND GND 0V A37 LCD_VDEN LCD_VDEN LCD 3.3V R5 A38 SD1_D0 SD1 SDIO V / G1 A39 LCD_RST LCD_RST LCD 3.3V F1 39

53 / A40 SD1_D1 SD1 SDIO V / J3 A41 LCD_MCLK LCD_MCLK LCD 3.3V F2 A42 SD1_D2 SD1 SDIO V / K3 A43 LCD_PWM LCD_PWM LCD 3.3V E4 A44 SD1_D3 SD1 SDIO V / H3 A45 GND GND 0V A46 SD1_CLK SD1 SDIO1 3.3V / G2 A47 ERR ERR 3.3V B4 A48 SD1_CMD SD1 SDIO1 3.3V / J4 A49 BEEP BEEP 3.3V A4 A50 GPIO0_8 GPIO GPIO0_8 3.3V / F4 A51 RUN 3.3V B3 A52 GPIO0_9 GPIO GPIO0_9 3.3V / D5 A53 REG AWorks GPIO 3.3V / G3 A54 GPIO0_10 GPIO GPIO0_10 3.3V / A3 A55 Factory 3.3V A5 A56 GPIO0_11 GPIO GPIO0_11 3.3V / A2 A57 UART2_RXD UART2 UART2 3.3V F17 A58 UART1_RXD UART1 UART1 3.3V E18 A59 UART2_TXD UART2 UART2 3.3V F16 A60 UART1_TXD UART1 UART1 3.3V F AW6748 B / B1 UPP_CHA_ENABLE upp upp A 3.3V / U16 B2 UPP_CHA_D15 upp upp A V / U18 B3 UPP_CHA_CLOCK upp upp A 3.3V / U17 B4 UPP_CHA_D14 upp upp A V / V16 B5 UPP_CHA_WAIT upp upp A 3.3V / T15 B6 UPP_CHA_D13 upp upp A V / R14 B7 UPP_CHA_START upp upp A 3.3V / W15 B8 UPP_CHA_D12 upp upp A V / W16 B9 GPIO6_6 GPIO GPIO6_6 3.3V / V15 B10 UPP_CHA_D11 upp upp A V / V17 B11 GPIO6_7 GPIO GPIO6_7 3.3V / W14 B12 UPP_CHA_D10 upp upp A V / W17 40

54 / B13 WatchDog 3.3V 3.3V B14 UPP_CHA_D9 upp upp A 9 3.3V / W18 B15 SYS_RESETn 3.3V B16 UPP_CHA_D8 upp upp A 8 3.3V / W19 B17 GND GND 0V B18 UPP_CHA_D7 upp upp A 7 3.3V / V18 B19 JTAG_TDI JTAG 3.3V M16 B20 UPP_CHA_D6 upp upp A 6 3.3V / V19 B21 JTAG_TMS JTAG 3.3V L16 B22 UPP_CHA_D5 upp upp A 5 3.3V / U19 B23 JTAG_TRSTn JTAG 3.3V L17 B24 UPP_CHA_D4 upp upp A 4 3.3V / T16 B25 JTAG_TCK JTAG 3.3V J15 B26 UPP_CHA_D3 upp upp A 3 3.3V / R18 B27 JTAG_RTCK JTAG 3.3V K17 B28 UPP_CHA_D2 upp upp A 2 3.3V / R19 B29 JTAG_EMU1 JTAG EMU1 3.3V / K16 B30 UPP_CHA_D1 upp upp A 1 3.3V / R15 B31 JTAG_EMU0 JTAG EMU0 3.3V / J16 B32 UPP_CHA_D0 upp upp A 0 3.3V / P17 B33 JTAG_TDO JTAG 3.3V J18 B34 GND GND 0V B35 I2C0_SCL I 2 C0 I 2 C0 3.3V G16 B36 USB1_D_P USB1 USB1 D+ 5V / P19 B37 I2C0_SDA I 2 C0 I 2 C0 3.3V / G18 B38 USB1_D_N USB1 USB1 D- 5V / P18 B39 EMAC_MDIO_CLK NET0 PHY 3.3V E16 B40 USB0_D_P USB0 USB0 D+ 5V / M19 B41 EMAC_MDIO_DAT NET0 PHY 3.3V D17 B42 USB0_D_N USB0 USB0 D- 5V / M18 B43 EMAC_MII_RXER NET0 3.3V C16 B44 USB0_VBUS USB0 USB0 VBUS 5V N19 B45 EMAC_MII_CRS NET0 3.3V C18 B46 USB0_ID USB0 USB0 ID 5V P16 B47 EMAC_MII_RXDV NET0 3.3V C17 41

55 / B48 USB0_DRVVBUSn USB0 USB0 VBUS 5V K18 B49 EMAC_MII_TXCLK NET0 3.3V D19 B50 GND GND 0V B51 EMAC_MII_RXD3 NET V C19 B52 GPIO2_12 GPIO GPIO2_12 3.3V / H16 B53 EMAC_MII_RXD2 NET V D18 B54 SPI1_MISO SPI1 SPI1 3.3V H17 B55 EMAC_MII_RXD1 NET V E17 B56 SPI1_CLK SPI1 SPI1 3.3V G19 B57 EMAC_MII_RXD0 NET V D16 B58 SPI1_MOSI SPI1 SPI1 3.3V G17 B59 EMAC_MII_COL NET0 3.3V D1 B60 SPI1_SCS0 SPI1 SPI1 3.3V E AW6748 C / C1 VDD_5V0 5V 5V C2 EMA_D15 EMIF-A EMIF-A V / E6 C3 VDD_5V0 5V 5V C4 EMA_D14 EMIF-A EMIF-A V / C7 C5 GND GND 0V C6 EMA_D13 EMIF-A EMIF-A V / B6 C7 SD0_CLK SD0 SDIO0 3.3V E9 C8 EMA_D12 EMIF-A EMIF-A V / A6 C9 SD0_CMD SD0 SDIO0 3.3V A10 C10 EMA_D11 EMIF-A EMIF-A V / D6 C11 SD0_D0 SD0 SDIO V / B10 C12 EMA_D10 EMIF-A EMIF-A V / A7 C13 SD0_D1 SD0 SDIO V / A11 C14 EMA_D9 EMIF-A EMIF-A 9 3.3V / D9 C15 SD0_D2 SD0 SDIO V / C10 C16 EMA_D8 EMIF-A EMIF-A 8 3.3V / E10 C17 SD0_D3 SD0 SDIO V / E11 C18 EMA_D7 EMIF-A EMIF-A 7 3.3V / D7 C19 GPIO4_1 GPIO GPIO4_1 3.3V / B11 C20 EMA_D6 EMIF-A EMIF-A 6 3.3V / C6 C21 GPIO4_0 GPIO GPIO4_0 3.3V / E12 C22 EMA_D5 EMIF-A EMIF-A 5 3.3V / E7 42

56 / C23 GPIO5_15 GPIO GPIO5_15 3.3V / C11 C24 EMA_D4 EMIF-A EMIF-A 4 3.3V / B5 C25 GPIO5_16 GPIO GPIO5_16 3.3V / A12 C26 EMA_D3 EMIF-A EMIF-A 3 3.3V / E8 C27 GND GND 0V C28 EMA_D2 EMIF-A EMIF-A 2 3.3V / B8 C29 EMA_A13 EMIF-A EMIF-A V D11 C30 EMA_D1 EMIF-A EMIF-A 1 3.3V / A8 C31 EMA_A12 EMIF-A EMIF-A V D13 C32 EMA_D0 EMIF-A EMIF-A 0 3.3V / C9 C33 EMA_A11 EMIF-A EMIF-A V B12 C34 EMA_RnW EMIF-A EMIF-A 3.3V D10 C35 EMA_A10 EMIF-A EMIF-A V C12 C36 EMA_WEn EMIF-A EMIF-A 3.3V B9 C37 EMA_A9 EMIF-A EMIF-A 9 3.3V D12 C38 EMA_OEn EMIF-A EMIF-A 3.3V B15 C39 EMA_A8 EMIF-A EMIF-A 8 3.3V A13 C40 EMA_WAIT1 EMIF-A EMIF-A 3.3V B19 C41 EMA_A7 EMIF-A EMIF-A 7 3.3V B13 C42 EMA_CSn5 EMIF-A EMIF-A 5 3.3V B16 C43 EMA_A6 EMIF-A EMIF-A 6 3.3V E13 C44 EMA_CSN4 EMIF-A EMIF-A 4 3.3V F9 C45 EMA_A5 EMIF-A EMIF-A 5 3.3V C13 C46 EMA_CSn2 EMIF-A EMIF-A 2 3.3V B17 C47 EMA_A4 EMIF-A EMIF-A 4 3.3V A14 C48 GND GND 0V C49 EMA_A3 EMIF-A EMIF-A 3 3.3V D14 C50 EMAC_MII_TXCLK NET0 3.3V D3 C51 EMA_A2 EMIF-A EMIF-A 2 3.3V B14 C52 EMAC_MII_TXEN NET0 3.3V C1 C53 EMA_A1 EMIF-A EMIF-A 1 3.3V D15 C54 EMAC_MII_TXD3 NET V E3 C55 EMA_A0 EMIF-A EMIF-A 0 3.3V C14 C56 EMAC_MII_TXD2 NET V E2 C57 EMA_BA1 EMIF-A Bank EMIF-A BA1 3.3V A15 C58 EMAC_MII_TXD1 NET V E1 C59 EMA_BA0 EMIF-A Bank EMIF-A BA0 3.3V C15 C60 EMAC_MII_TXD0 NET V F3 43

57 3.3 M28x-T (ARM9 ) M28x-T MiniARMM283-64F128LI-TM F128LI-TM287-64F128LI-T M F128LI-T ZLG NXP ARM9 i.mx283/7 454MHz DDR2Nand Flash UARTI 2 C I 2 SEthernetUSB PMU M28x-T M283-T M287-T M283-T 3.8 M287-T 3.9 M28x-T () CPUNXP i.mx283/ 7 454MHz 64/128M DDR2 128MB NandFlash PMU Linux AWorks 44

58 SD/MMC U 1 USB2.0 HOST1 USB2.0 OTG 2 10M/100M 6 2 CAN 1 SD Card 1 SDIO 1 I²C1 SPI1 I²S 4 12 ADC LCD JTAG 6 PCB 30mm48mm 3.3V2% -40~ M28x-T i.mx283/7ddr2nandflash 30mm48mm M28x-T M28x-T M28x-T M283-64F128LI-T M F128LI-T M287-64F128LI-T M F128LI-T i.mx283 i.mx283 i.mx287 i.mx MHz 454MHz 454MHz 454MHz 45

59 M283-64F128LI-T M F128LI-T M287-64F128LI-T M F128LI-T 64MB 128MB 64MB 128MB 128MB 128MB 128MB 128MB LinuxAWorks LinuxAWorks LinuxAWorks LinuxAWorks LCD USB 1 HOST1 OTG 1 HOST1 OTG 1 HOST1 OTG 1 HOST1 OTG CAN SD I2S SDIO I 2 C SPI HSADC LRADC PWM GPIO I/O M28x-T I/O BSP 3.11 J1A1 ~ A80 J2B1 ~ B80 J1 J M28x-T

60 3.9 M28x-T J1 / A1 GND 0V POWER A2 GND 0V A3 nrst_out 3.3V WDG A4 nrst_in 3.3V A5 SPI3_SCK 3.3V A2 A6 SPI3_MOSI 3.3V C2 SPI3 A7 SPI3_MISO 3.3V B2 A8 SPI3_SS V D2 A9 AUART2_TX 2 3.3V C3 A10 AUART3_RX 3 3.3V B3 A11 AUART3_TX AUART 3 3.3V C4 A12 AUART2_RX 2 3.3V A3 A13 AUART4_RX 4 3.3V F7 A14 GPIO3_20 GPIO GPIO3_20 3.3V G7 A15 AUART4_TX AUART 4 3.3V E7 A16 GPIO3_21 GPIO3_21 3.3V G6 A17 GPIO3_26 GPIO3_26 3.3V E8 A18 GPIO3_27 GPIO V D7 A19 GPIO1_28 GPIO1_28 3.3V L1 A20 GPIO1_29 GPIO1_29 3.3V M1 A21 ENET1_TXD0 NET V G1 A22 GPIO1_30 GPIO GPIO1_30 3.3V N1 A23 ENET1_TXD V G2 A24 ENET1_RX_EN 3.3V J3 A25 ENET1_TX_EN 3.3V J4 A26 ENET1_RXD V J1 A27 ENET0_RX_EN NET1 3.3V E4 A28 ENET1_RXD V J2 A29 ENET0_TXD V F1 A30 ENET0_TXD V F2 A31 GPIO4_5 GPIO GPIO4_5 3.3V E3 A32 ENET0_RXD0 NET V H1 A33 GPIO4_13 GPIO GPIO4_13 3.3V F3 A34 ENET0_RXD1 NET V H2 A35 ENET_MDC 3.3V G4 A36 ENET0_TX_EN 3.3V F4 NET A37 ENET_MDIO 3.3V / H4 A38 ENET_CLK 3.3V E2 A39 GND POWER 0V 47

61 / A40 GND POWER 0V A41 USB_OTG_ID USB0 OTG OTG ID 3.3V K8 A42 USB_H_N USB1 N 3.3V / B8 A43 GPIO3_29 GPIO GPIO3_29 3.3V E10 A44 USB_H_P USB1 P 3.3V / A8 A45 USB_OTG_P USB0 OTG P 3.3V / B10 A46 VDD_XTAL POWER 3.3V C12 A47 USB_OTG_N USB0 OTG N 3.3V / A10 A48 PSWITCH PSWITCH 3.3V A11 A49 GPIO1_31 GPIO GPIO1_31 3.3V N5 A50 BOOT_SD BOOT SD BT 3.3V A51 WDO_EN WDG 3.3V A52 BOOT_USB BOOT USB BT 3.3V A53 GND 0V A54 GND 0V POWER A55 GND 0V A56 GND 0V A57 3.3V 3.3V A58 3.3V 3.3V POWER A59 3.3V 3.3V A60 3.3V 3.3V A61 USB_DEV_DET DEVICE 5V POWER A62 USB_DEV_DET DEVICE 5V E17 A63 SD_D V / C6 A64 SD_D V / B6 A65 SD_D V / A5 A66 SD_D V / D6 SD0 A67 SD_WP 3.3V N9 A68 SD_CMD 3.3V A4 A69 SD_CARD_DETE 3.3V D10 A70 SD_SCK 3.3V A6 A71 ADC0 ADC0 3.3V C15 A72 HSADC ADC 3.3V B14 ADC A73 ADC6 ADC6 3.3V C14 A74 ADC1 ADC1 3.3V C9 A75 JTAG_TDO 3.3V E13 A76 JTAG_TCK 3.3V E11 JTAG A77 JTAG_TRST 3.3V D14 A78 JTAG_TMS 3.3V D12 48

62 / A79 JTAG_RTCK 3.3V E14 JTAG A80 JTAG_TDI 3.3V E M28x-T J2 / B1 GPIO2_13 GPIO2_13 3.3V C1 B2 GPIO2_12 GPIO GPIO2_12 3.3V B1 B3 GPIO2_ GPIO2_15 3.3V E1 B4 GPIO2_14 GPIO2_14 3.3V D1 B5 GPIO3_7 GPIO3_7 3.3V J5 B6 GPIO3_6 GPIO3_6 3.3V K5 B7 GPIO3_11 GPIO3_11 3.3V H7 B8 GPIO3_10 GPIO3_10 3.3V H6 B9 GPIO3_14 GPIO3_14 3.3V L6 GPIO B10 GPIO3_15 GPIO3_15 3.3V K6 B11 GPIO3_13 GPIO3_13 3.3V L5 B12 GPIO3_12 GPIO3_12 3.3V M5 B13 GPIO3_9 GPIO3_9 3.3V F5 B14 GPIO3_8 GPIO3_8 3.3V F6 B15 AUART1_TX 1 3.3V K4 AUART1 B16 AUART1_RX 1 3.3V L4 B17 AUART0_TX 0 3.3V H5 AUART0 B18 AUART0_RX 0 3.3V G5 B19 NC NC B20 NC NC B21 NC NC B22 NC NC B23 NC NC NC B24 NC NC B25 NC NC B26 NC NC B27 NC NC B28 NC NC B29 DUART_TX 3.3V J7 DUART B30 DUART_RX 3.3V J6 B31 GPIO1_17 GPIO1_17 3.3V R3 GPIO B32 GPIO1_16 PHY 3.3V T3 49

63 / B33 Factory CFG 3.3V -IO1_19 T4 B34 GPIO1_18 GPIO GPIO1_18 3.3V U4 B35 BEEP GPIO 3.3V -IO1_21 U5 B36 REG CFG 3.3V -IO1_20 R4 B37 ERR - IO1_23 3.3V R5 GPIO B38 RUN - IO1_22 3.3V T5 B39 I2C1_SDA I 2 C1 I 2 C1 3.3V / L7 B40 I2C1_SCL I 2 C1 I 2 C1 3.3V K7 B41 TFT_D1 TFT_B1 3.3V K3 B42 TFT_D0 TFT_B0 3.3V K2 B43 TFT_D3 TFT_B3 3.3V L3 B44 TFT_D2 TFT_B2 3.3V L2 B45 TFT_D5 TFT_G0 3.3V M3 B46 TFT_D4 TFT_B4 3.3V M2 B47 TFT_D7 TFT_G2 3.3V P1 B48 TFT_D6 TFT_G1 3.3V N2 B49 TFT_D9 TFT_G4 3.3V P3 B50 TFT_D8 TFT_G3 3.3V P2 B51 TFT_D11 LCD TFT_R0 3.3V R2 B52 TFT_D10 TFT_G5 3.3V R1 B53 TFT_D13 TFT_R2 3.3V T2 B54 TFT_D12 TFT_R1 3.3V T1 B55 TFT_D15 TFT_R4 3.3V U3 B56 TFT_D14 TFT_R3 3.3V U2 B57 TFT_VCLK TFT 3.3V M4 B58 TFT_RESET TFT 3.3V M6 B59 TFT_VSYNC TFT 3.3V P4 B60 TFT_HSYNC TFT 3.3V K1 B61 TFT_PWM 3.3V E9 B62 TFT_VDEN 3.3V P5 B63 TS_XP X 3.3V C8 B64 TS_XM X 3.3V D13 B65 TS_YP Y 3.3V D9 B66 TS_YM Y 3.3V D15 B67 CAN1_RX 3.3V M9 CAN0/1 B68 CAN1_TX 3.3V M7 283 B69 CAN0_RX 3.3V L8 B70 CAN0_TX 3.3V M8 B71 GPIO3_25 GPIO GPIO3_25 3.3V D8 50

64 / B72 GPIO2_4 GPIO2_4 3.3V B5 B73 GPIO3_24 GPIO3_24 3.3V C7 B74 GPIO2_5 GPIO2_5 3.3V C5 B75 GPIO2_20 GPIO GPIO2_20 3.3V D3 B76 GPIO2_6 GPIO2_6 3.3V D5 B77 GPIO2_21 GPIO2_21 3.3V D4 B78 GPIO2_7 GPIO2_7 3.3V B4 B79 GND POWER 0V B80 GND POWER 0V 3.4 M6G2C (A7 ) M6G2C M6G2C-128LIM6G2C-256LIM6Y2C-256F256LI-T ZLG NXP Cortex-A7 528MHz 800MHz DDR3 NandFlash 8 UART2 USB OTG 2 CAN-bus2 M6G2C EMC 3.12 a M6G2C 3.12b M6G2C 32 Cortex-A7 528MHz/800MHz 128/256MB DDR3 51

65 Flash128/256MB NandFlash Linux AWorks 8 CAN-bus 2 10/100M 2 USB2.0 OTG PHY 2 SD 1 MQS LCDSPII 2 CI 2 SCSIADC SD USB 5V5% PCB 6 30mm48mm -40~ M6G2C i.mx6ul DDR3NandFlash 30mm48mm M6G2C M6G2C 3.11 M6G2C M6Y2C-256F256LI-T M6G2C-128LI M6G2C-256LI CPU 6Y2CVM08AA 6G2CVM05AA 6G2CVM05AA 800MHz 528MHz 528MHz 52

66 M6Y2C-256F256LI-T M6G2C-128LI M6G2C-256LI NandFlash 256MB 128MB 256MB 256MBDDR3 128MBDDR3 256MBDDR3 LinuxAWorks 2 USB OTG 2 CAN 1 CSI 1 LCD RGB565 SD 2 UART 8 I 2 C 1 I 2 C 4 I 2 C SPI 1 4 I 2 S/SAI 2 PWM 2 8 ADC JTAG PWM GPIO I/O M6G2C I/O BSP 3.14 A B M6G2C 53

67 3.12 M6G2C A / A1 ENET_MDIO 3.3V / K17 A2 ENET_MDC 3.3V L16 A3 ENET1_RXD V E17 A4 ENET2_RXD V C16 A5 ENET1_RXD V F16 A6 ENET2_RXD V C17 A7 ENET1_RXEN 3.3V E16 A8 ENET2_RXEN 3.3V B17 A9 ENET1_RXER ENET1& 3.3V D15 A10 ENET2_RXER ENET2 3.3V D16 A11 ENET1_TXD V E14 A12 ENET2_TXD V A16 A13 ENET1_TXD V E15 A14 ENET2_TXD V A15 A15 ENET1_TXEN 3.3V F15 A16 ENET2_TXEN 3.3V B15 A17 ENET1_TX_CLK 1 3.3V F14 A18 ENET2_TX_CLK 2 3.3V D17 A19 GND GND A20 GND A21 MQS_LEFT B16 A22 MOS_RIGHT A14 A23 UART7_RX 3.3V B13 A24 UART7_TX 3.3V C13 UART A25 UART8_RX 3.3V B14 A26 UART8_TX 3.3V C14 A27 PWM_OUT6 PWM 3.3V D14 PWM A28 PWM_OUT5 PWM 3.3V A13 A29 LCD_R V D13 A30 LCD_R V A12 A31 LCD_R V B12 A32 LCD_R V C12 A33 LCD_R V D12 A34 LCD_G5 LCD 5 3.3V E12 A35 LCD_G V A11 A36 LCD_G V B11 A37 LCD_G V D11 A38 LCD_G V A10 A39 LCD_G V B10 54

68 / A40 LCD_B V C10 A41 LCD_B V D10 A42 LCD_B2 LCD 2 3.3V E10 A43 LCD_B V A9 A44 LCD_B V B9 A45 GND 0V GND A46 GND 0V A47 LCD_PCLK 3.3V A8 A48 LCD_HSYNC 3.3V D9 LCD A49 LCD_DE 3.3V B8 A50 LCD_VSYNC 3.3V C9 A51 GPIO3_4 GPIO GPIO 3.3V E9 A52 GND GND A53 BT_CFG1_6 01 :SD 3.3V BOOT A54 BT_CFG1_7 10 : Nand () 3.3V A55 GPIO4_14(ERR) ERR 3.3V / B5 GPIO A56 GPIO4_16(RUN) 3.3V / E6 A57 UART6_TX UART 3.3V F5 A58 SD1_CD SD1 SD 3.3V J14 A59 UART6_RX UART 3.3V E5 A60 SD1_WP SD 3.3V K15 A61 SD2_CLK SD2 3.3V F2 A62 SD1_CLK SD1 3.3V C1 A63 SD2_CMD SD2 3.3V F3 A64 SD1_CMD SD1 3.3V C2 A65 SD2_DATA V / E4 A66 SD1_DATA0 SD1&SD V / B3 A67 SD2_DATA V / E3 A68 SD1_DATA V / B2 A69 SD2_DATA V / E2 A70 SD1_DATA V / B1 A71 SD2_DATA V / E1 A72 SD1_DATA V / A2 A73 SPI1_SCK SPI 3.3V D4 A74 SPI1_SS0 SPI 3.3V D3 SPI1 A75 SPI1_MOSI 3.3V D2 A76 SPI1_MISO 3.3V D1 A77 GND GND 0V A78 5V_IN POWER 5V 5V 55

69 / A79 GND GND 0V A80 5V_IN POWER 5V 5V 3.13 M6G2C B / B1 BOOT_MODE V T10 BOOT B2 BOOT_MODE V U10 B3 nrst_out 3.3V RESET B4 nrst_in 3.3V B5 WDO_EN 3.3V B6 MX6_ONOFF / 3.3V R9 B7 CAN1_TX 3.3V H15 B8 CAN1_RX 3.3V G14 CAN1&CAN2 B9 CAN2_TX 3.3V J15 B10 CAN2_RX 3.3V H14 B11 GPIO5_9 GPIO GPIO 3.3V R6 B12 GPIO5_1(Factory) GPIO GPIO 3.3V R9 B13 I2C_SDA I 2 C 3.3V / N9 B14 GPIO5_2(CLR) GPIO GPIO 3.3V P11 B15 GPIO5_5 GPIO GPIO 3.3V N8 B16 GPIO5_4 GPIO GPIO 3.3V P9 B17 I2C_SCL I 2 C 3.3V N10 B18 GPIO5_3 GPIO GPIO 3.3V P10 B19 GPIO5_6 GPIO GPIO 3.3V N11 B20 GND GND B21 USB_OTG1_VBUS VBUS 5V T12 B22 USB_OTG2_VBUS VBUS 5V U12 B23 USB_OTG1_ID ID 3.3V K13 B24 USB_OTG2_ID ID 3.3V M17 B25 USB_OTG1_D_N USB1&USB2 3.3V / T15 B26 USB_OTG2_D_N 3.3V / T13 B27 USB_OTG1_D_P 3.3V / U15 B28 USB_OTG2_D_P 3.3V / U13 B29 nusb_otg_chd 3.3V U16 B30 GND 0V GND B31 GND 0V B32 JTAG_TCK JTAG 3.3V M14 B33 PMIC_ON_REQ 3.3V T9 56

70 / B34 JTAG_nTRST JTAG 3.3V N14 B35 CCM_CLK1_N 3.3V P16 B36 JTAG_TMS JTAG 3.3V P14 B37 CCM_CLK1_P 3.3V P17 B38 JTAG_TDI JTAG 3.3V N16 B39 ADC_CH9 ADC ADC 9 M15 B40 JTAG_TDO JTAG 3.3V N15 B41 ADC_CH8 ADC ADC 8/ N17 B42 JTAG_MOD JTAG 3.3V P15 B43 VREF_ADC ADC M13 B44 GND GND 0V B45 UART1_TX 3.3V K14 B46 UART1_RX 3.3V K16 B47 UART2_TX 3.3V J17 B48 UART2_RX 5.0V J16 B49 UART3_TX 3.3V H17 UART B50 UART3_RX 3.3V H16 B51 UART4_TX 3.3V G17 B52 UART4_RX 3.3V G16 B53 UART5_TX 3.3V F17 B54 UART5_RX 3.3V G13 B55 TS_XN XPUL 3.3V L17 B56 TS_XP XNUR 3.3V M16 TOUCH B57 TS_YN YPLL 3.3V L15 B58 TS_YP YNLR 3.3V L14 B59 GND GND 0V B60 3V_BAT RTC 3.5 M3352 (A8 ) M3352 MiniARM M LI-F128T M LI-F256T M LI-F512TM LI-F512TM LI-F1GT ZLG AM335x 800MHz Cortex-A8 ARM9M UART2 CAN-Bus2 USB OTG2 M a 3.15b 57

71 M3352 IoT-A3352LI() CPUTI Cortex-A8 AM MHz 128M256M512M DDR3 128M256M512M1G NandFlash Linux AWorks TCP/IP SD/MMC U 2 USB2.0 OTG 1 100M RMII 1 RGMII 6 1 SD Card CANUARTI 2 C JTAG 6 PCB 35mm48mm 5V2% M3352 AM335xDDR3NandFlash 35mm 48mm

72 3.16 M M CPU 5 M LI-F128TM LI-F256T M LI-F512TM LI-F512TM LI-F1GT 3.14 M3352 M3352- M LI- 256LI- 512LI 256LI- 512LI- F128T F256T -F512T F512T F1GT LinuxAWorks AM3352 AM3352 AM3352 AM3354 AM MHz 128MB 256MB 512MB 256MB 512MB 128MB 256MB 512MB 512MB 1GB 1366 x 768 USB 2 6 CAN-bus 2 2 SD 1 SPI 1 I²C 1 ADC 4 12 PWM 3 59

73 3.5.5 I/O M3352 I/O BSP 3.17 J1 J2 J1 J M M3352 (J1) / A1 A2 NC NC A3 A4 A5 GPIO1_15 GPIO1_15 3.3V / U13 GPIO A6 GPIO1_12 GPIO1_12 3.3V / T12 A7 TFT_HSYNC TFT 3.3V R5 A8 TFT_B0 16bit TFT 0 3.3V R1 A9 TFT_VCLK TFT 3.3V V5 A10 TFT_B1 16bit TFT 1 3.3V R2 LCD A11 TFT_VSYNC TFT 3.3V U5 A12 TFT_B2 16bit TFT 2 3.3V R3 A13 TFT_VDEN TFT 3.3V R6 A14 TFT_B3 16bit TFT 3 3.3V R4 A15 GND POWER 0V A16 TFT_B4 LCD 16bit TFT 4 3.3V T1 NETPHY_RXCL RMII1_REF_ A17 3.3V H18 K CLK A18 TFT_G0 LCD 16bit TFT 0 3.3V T2 A19 NETPHY_RXDV MII1_CRS 3.3V H17 A20 TFT_G1 LCD 16bit TFT 1 3.3V T3 A21 NETPHY_TXE# MII1_TX_EN 3.3V J16 A22 TFT_G2 LCD 16bit TFT 2 3.3V T4 60

74 / A23 NETPHY_RXER MII1_RX_ER 3.3V J15 A24 TFT_G3 LCD 16bit TFT 3 3.3V U1 A25 NETPHY_TXD1 MII1_TXD V K16 A26 TFT_G4 LCD 16bit TFT 4 3.3V U2 A27 NETPHY_TXD0 MII1_TXD V K17 A28 TFT_G5 LCD 16bit TFT 5 3.3V U3 A29 NETPHY_RXD1 MII1_RXD V L15 A30 TFT_R0 LCD 16bit TFT 0 3.3V U4 A31 NETPHY_RXD0 MII1_RXD V M16 A32 TFT_R1 LCD 16bit TFT 1 3.3V V2 A33 GND POWER 0V A34 TFT_R2 LCD 16bit TFT 2 3.3V V3 A35 MII_MDC MDIO PHY 3.3V M18 A36 TFT_R3 LCD 16bit TFT 3 3.3V V4 A37 MII_MDIO MDIO PHY 3.3V / M17 A38 TFT_R4 LCD 16bit TFT 4 3.3V T5 A39 GND POWER 0V A40 GND POWER 0V A41 GPMC_A0 RGMII2 RGMII_TCTL 3.3V R13 A42 GPMC_D0 GPMC GPMC 0 3.3V / U7 A43 GPMC_A1 RGMII3 RGMII_RCTL 3.3V V14 A44 GPMC_D1 GPMC GPMC 1 3.3V / V7 A45 GPMC_A2 RGMII4 RGMII_TXD3 3.3V U14 A46 GPMC_D2 GPMC GPMC 2 3.3V / R8 A47 GPMC_A3 RGMII5 RGMII_TXD2 3.3V T14 A48 GPMC_D3 GPMC GPMC 3 3.3V / T8 A49 GPMC_A4 RGMII6 RGMII_TXD1 3.3V R14 A50 GPMC_D4 GPMC GPMC 4 3.3V / U8 A51 GPMC_A5 RGMII7 RGMII_TXD0 3.3V V15 A52 GPMC_D5 GPMC GPMC 5 3.3V / V8 A53 GPMC_A6 RGMII8 RGMII_TCLK 3.3V U15 A54 GPMC_D6 GPMC GPMC 6 3.3V / R9 A55 GPMC_A7 RGMII9 RGMII_RCLK 3.3V T15 A56 GPMC_D7 GPMC GPMC 7 3.3V / T9 A57 GPMC_A8 RGMII10 RGMII_RXD3 3.3V V16 A58 GND POWER 0V A59 GPMC_A9 RGMII11 RGMII_RXD2 3.3V U16 61

75 / A60 GPMC_nBE0_CLE GPMC GPMC 3.3V T6 A61 GPMC_A10 RGMII12 RGMII_RXD1 3.3V T16 A62 GPMC_nWE GPMC GPMC 3.3V U6 A63 GPMC_A11 RGMII13 RGMII_RXD0 3.3V V17 A64 GPMC_nAVD_ALE GPMC 3.3V R7 A65 GPMC_nWAIT0 GPMC GPMC 0 3.3V T17 A66 GPMC_nOE GPMC 3.3V T7 A67 GPIO1_28 3.3V U18 A68 GPMC_nWP GPMC GPMC 3.3V U17 A69 USB0_D_P USB0 D+ 3.3V / N17 A70 USB1_DRVVBUS USB1 VBUS 3.3V F15 A71 USB0_D_N USB0 D- 3.3V / N18 A72 USB1_D_P USB0 D+ 3.3V / R17 A73 USB0_DRVVBUS USB0 VBUS 3.3V F16 A74 USB1_D_N USB0 D- 3.3V / R18 USB A75 USB0_VBUS USB0 VBUS 5.0V P15 A76 USB1_ID USB1 ID 3.3V P17 A77 USB0_ID USB0 ID 3.3V P16 A78 USB1_CE USB1 3.3V P18 A79 USB0_CE USB0 3.3V M15 A80 USB1_VBUS USB1 VBUS 5.0V T18 / B1 5V B2 5V VDD_5.0 POWER 5V B3 5V B4 5V B5 GND POWER 0V B6 GND POWER 0V B7 MMC0_D3 SD SD 3 3.3V / F17 B8 nrstout Reset Out 3.3V A10 B9 MMC0_D2 SD SD 2 3.3V / F18 B10 Vref_ADC ADC ADC B11 MMC0_D1 SD SD 1 3.3V / G15 B12 I2C2_SDA I 2 C I 2 C2_SDA 3.3V / A17 B13 MMC0_D0 SD SD 0 3.3V / G16 B14 I2C2_SCL I 2 C I 2 C2_SCL 3.3V B17 62

76 / B15 MMC0_nCD SD SD 3.3V C15 B16 I2C1_SCL I 2 C I 2 C1_SCL 3.3V A16 B17 MMC0_CLK SD SD 3.3V G17 B18 I2C1_SDA I 2 C I 2 C1_SDA 3.3V / B16 B19 MMC0_CMD SD SD 3.3V / G18 B20 GND POWER 0V B21 GPIO1_13 GPIO GPIO1_13 3.3V / R12 B22 EMU4 GPMC_nCS3 GPIO2_0 3.3V T13 B23 GPIO1_14 GPIO GPIO1_14 3.3V / V13 B24 EMU2 SD GPIO0_19 SD 3.3V A15 B25 GPIO0_7 GPIO0_7 3.3V C18 GPIO B26 EMU3 GPIO0_20 3.3V D14 B27 NAND/SD NAND SD 3.3V R3 B28 EMU0 EMU EMU0 3.3V / C14 B29 PWR_OK 3.3V 3.3V B30 EMU1 EMU EMU1 3.3V / B14 B31 WDO_EN / 3.3V B32 GND POWER 0V B33 nrst_in nrst_in 3.3V B34 MCASP0_AH CLKX GPIO GPIO3_21 3.3V A14 B35 GND POWER 0V B36 MCASP0_AX R1 MCASP 1 3.3V / D13 B37 UART0_TXD UART UART0 3.3V E16 B38 MCASP0_FSR MCASP 3.3V C13 B39 UART0_RXD UART UART0 3.3V E15 B40 MCASP0_AC LKX MCASP 3.3V A13 B41 UART1_TXD UART UART1 3.3V D15 B42 MCASP0_FSX MCASP 3.3V B13 B43 UART1_RXD UART UART1 3.3V D16 B44 MCASP0_AH CLKR GPIO3_17 3.3V C12 B45 UART2_TXD UART UART2 3.3V L18 B46 MCASP0_AC LKR MCASP 3.3V B12 B47 UART2_RXD UART UART2 3.3V K18 63

77 / B48 MCASP0_AXR0 MCASP 0 3.3V / D12 B49 UART3_TXD UART UART3 3.3V L16 B50 GND POWER 0V B51 UART3_RXD UART UART3 3.3V L17 B52 JTAG_TCK JTAG TAP 3.3V A12 B53 UART4_TXD UART UART4 3.3V K15 B54 JTAG_TDO JTAG TAP 3.3V A11 B55 UART4_RXD UART UART4 3.3V J18 B56 JTAG_TDI JTAG TAP 3.3V B11 B57 UART5_TXD UART UART5 3.3V J17 B58 JTAG_TMS JTAG TAP 3.3V C11 B59 UART5_RXD UART UART5 3.3V H16 B60 JTAG_nTRST JTAG TAP 3.3V B10 B61 CAN0_TXD CAN CAN0 3.3V D18 B62 AI_7 ADC 1.8V C9 B63 CAN0_RXD CAN CAN0 3.3V D17 B64 AI_6 ADC 1.8V A8 B65 CAN1_TXD CAN CAN1 3.3V E18 B66 AI_5 ADC 1.8V B8 B67 CAN1_RXD CAN CAN1 3.3V E17 B68 AI_4 ADC 1.8V C8 B69 GPIO0_22 GPIO GPIO0_22 3.3V / U10 B70 AI_3 TOUCH YNLR 1.8V A7 B71 GPIO0_23 GPIO GPIO0_23 3.3V / T10 B72 AI_2 TOUCH YPLL 1.8V B7 B73 GPIO0_26 GPIO GPIO0_26 3.3V / T11 B74 AI_1 TOUCH XNUR 1.8V C7 B75 GPIO0_27 GPIO GPIO0_27 3.3V / U12 B76 AI_0 TOUCH XPUL 1.8V B6 B77 GPIO1_31 GPIO GPIO1_31 3.3V / V9 B78 GND POWER 0V B79 GPIO1_30 GPIO GPIO1_30 3.3V / U9 B80 VBAT RTC CPU RTC 3V 3.0V 64

78 (1) AW280-64F8 (2) M283-64F128LI-T (3) M F128LI-T (4) M287-64F128LI-T (5) M F128LI-T (6) AW (7) AW F128 (8) M6Y2C-256F256LI-T (9) M6G2C-128LI (10) M6G2C-256LI (11) M LI-F128T (12) M LI-F256T (13) M LI-F512T (14) M LI-F512T (15) M LI-F1GT 65

79 3.17 ARM9 & DSP & Cortex-A AW280 M283- M287- AW6748- M6Y2C- M6G2C- M3352- M F F F LI-F LI G LI-T LI-T T i.mx TMS320 6Y2CVM0 CPU AM3352 AM C6748 8AA 5AA (MHz) Flash(MB) (MB) AWor LinuxAWorks AWorks LinuxAWorks ks CAN UART I 2 C I 2 C SPI USB 1 HOST1 OTG 2 USB 2.0 OTG SD LCD RGB(565) CSI D/3D I 2 S/SAI PWM () 2 ADC GPIO JTAG 3.3V 5.0V -40 ~ mm 3548mm 3048mm 3548mm 66

80 4ARM9&Cortex-A ARM9Cortex-A SoC Wi-FizigbeeLoRa RFID AWorks IoT A280 (ARM9 ) A280 A280-Z64F8AWI-TA280-W64F8AWI-TA280-M64F8AWI-T ZLG SoC NXP ARM9 i.mx28 454MHz DDR2SPI Flash Wi-FizigbeeRFIDUARTI 2 CI 2 SEthernet USBSSP PMU A zigbee 4.2 Wi-Fi 4.3 RFID A280-Z64F8AWI-T 4.2 A280-W64F8AWI-T 4.3 A280-M64F8AWI-T 4.4 AW280_EV_Board () 67

81 4.1.2 CPUNXP i.mx28 454MHz 64MB DDR2 8MB SPI Flash PMU AWorks TCP/IP SD/MMC U 1 10M/100M 1 SD Card 1 USB2.0 Host1 USB2.0 OTG zigbeewi-fi RFID 4 2 I²C1 SPI8 12 ADC( 1 ADC) JTAG 6 PCB 30mm48mm 3.3V2% A280 i.mx28 DDR2SPI FlashWi-Fizigbee RFID 30mm48mm A A280 68

82 4.1.4 A A280 A280-Z64F8AWI-T A280-W64F8AWI-T A280-M64F8AWI-T AWorks ARM i.mx28 ARM 454MHz 64MB 8MB zigbee Wi-Fi RFID USB 1 HOST1 OTG CAN-bus 2 SD I²C 2 ADC 8 PWM I/O A280 I/O SDK 4.6 J1A1 ~ A80 J2B1 ~ B80 J1 J A280 69

83 4.2 A280 (J1) / USB_DEV_DE USB Device A1 USB DEVICE 5V E17 T A2 3.3V 3.3V 3.3V A3 GND, 0V A4 3.3V 3.3V 3.3V A5 ADC0 ADC12 ADC0 428KHz 1.8V C15 A6 GND, 0V A7 ADC1 ADC ADC1 428KHz 1.8V C9 A8 JTAG_TRST JTAG JTAG 3.3V D14 A9 ADC6 ADC ADC6 428KHz 1.8V C14 JTAG_RTCK/ A10 JTAG JTAG 3.3V E14 GPIO4_20 A11 HSADC ADC ADC 2MHz 1.8V B14 A12 JTAG_TDO JTAG JTAG 3.3V E13 USB_OTG_ID/ A13 USB OTG USB OTG / 3.3V K8 GPIO3_18 A14 JTAG_TCK JTAG JTAG 3.3V E11 A15 USB_OTG_P USB OTG USB OTG P 5V / B10 A16 JTAG_TMS JTAG JTAG 3.3V D12 A17 USB_OTG_N USB OTG USB OTG N 5V / A10 A18 JTAG_TDI JTAG JTAG 3.3V E12 A19 USB_H_P USB HOST USB HOST P 5V / A8 A20 GND, 0V A21 USB_H_N USB HOST USB HOST N 5V / B8 USB0_DEVICE A22 nrst_out 3.3V USB HOST 5V BEEP/GPIO3_ A23 GPIO 3.3V / E10 29 A24 nrst_in 3.3V A25 ERR/GPIO2_5 SYS, 3.3V C V A26 WDO_EN 3.3V A27 RUN/GPIO2_6 SYS, 3.3V D5 70

84 / SYS A28 Factory/GPIO2_4 3.3V / B5 A29 I2C1_SCL/GPIO3_16 I 2 C1 I 2 C1 3.3V K7 A30 I2C0_SCL/GPIO3_24 I 2 C0 I 2 C0 3.3V C7 A31 I2C1_SDA/GPIO3_17 I 2 C1 I 2 C1 3.3V / L7 A32 I2C0_SDA/GPIO3_25 I 2 C0 I 2 C0 3.3V / D8 A33 VDD_XTAL 3.3V C12 A34 GND 0V A35 PSWITCH 1.2V A11 A36 GPIO3_26 GPIO GPIO3_26 3.3V / E8 A37 GPIO3_21 GPIO GPIO3_21 3.3V / G6 A38 AUART4_RX/GPIO3_22 AUART V F7 A39 GPIO3_20 GPIO GPIO3_20 3.3V / G7 A40 AUART4_TX/GPIO3_23 AUART V E7 A41 SD_D0/GPIO2_0 SDIO SDIO 0 3.3V / B6 A42 SD_WP/GPIO0_17 SDIO SDIO 3.3V N9 A43 SD_D1/GPIO2_1 SDIO SDIO 1 3.3V / C6 A44 SD_DETECT/GPIO2_9 SDIO SDIO 3.3V D10 A45 SD_D2/GPIO2_2 SDIO SDIO 2 3.3V / D6 A46 SD_SCK/GPIO2_10 SDIO SDIO 3.3V A6 A47 SD_D3/GPIO2_3 SDIO SDIO 3 3.3V / A5 A48 SD_CMD/GPIO2_8 SDIO SDIO 3.3V A4 A49 ENET1_RX_EN/GPIO4_15 NET V J3 A50 GND 0V A51 ENET1_RXD1/GPIO4_10 NET V J2 A52 ENET1_TX_EN/GPIO4_14 NET V J4 A53 ENET1_RXD0/GPIO4_9 NET V J1 A54 ENET1_TXD1/GPIO4_12 NET V G2 A55 ENET0_RX_CLK/GPIO4_13 NET V F3 A56 ENET1_TXD0/GPIO4_11 NET V G1 A57 ENET0_RX_EN/GPIO4_2 NET V E4 A58 ENET0_TX_CLK/GPIO4_5 NET V E3 A59 ENET0_RXD1/GPIO4_4 NET V H2 A60 ENET0_TX_EN/GPIO4_6 NET V F4 A61 ENET0_RXD0/GPIO4_3 NET V H1 A62 ENET0_TXD1/GPIO4_8 NET V F2 A63 ENET_MDIO/GPIO4_1 NET 3.3V / H4 71

85 / A64 ENET0_TXD0/GPIO4_7 NET V F1 A65 ENET_CLK/GPIO4_16 NET 3.3V E2 A66 ENET_MDC/GPIO4_0 NET 3.3V G4 A67 GND 0V A68 GND 0V A69 GPIO1_30 GPIO GPIO1_30 3.3V / N1 A70 GPIO1_28 GPIO GPIO1_28 3.3V / L1 A71 GPIO1_31 GPIO GPIO1_31 3.3V / N5 A72 GPIO1_29 GPIO GPIO1_29 3.3V / M1 A73 GPIO2_12 GPIO GPIO2_12 3.3V / B1 A74 SPI3_SCK/GPIO2_24 SPI3 SPI3 3.3V A2 A75 GPIO2_13 GPIO GPIO2_13 3.3V / C1 A76 SPI3_MOSI/GPIO2_25 SPI3 SPI3 3.3V / C2 A77 GPIO2_14 GPIO GPIO2_14 3.3V / D1 A78 SPI3_MISO/GPIO2_26 SPI3 SPI3 3.3V B2 A79 GPIO2_15 GPIO GPIO2_15 3.3V / E1 A80 SPI3_SS0/GPIO2_27 SPI3 SPI V / D2 4.3 A280 (J2) / B1 GPIO0_16 GPIO GPIO0_16 3.3V / N7 B2 GPIO0_7 GPIO GPIO0_7zigbee 3.3V / T6 B3 GPIO0_20 GPIO GPIO0_20 3.3V / N6 B4 GPIO0_6 GPIO GPIO0_6zigbee/Wi-Fi 3.3V / U6 B5 GPIO0_21 GPIO GPIO0_21Wi-Fi/Mifare 3.3V / N8 B6 GPIO0_5 GPIO GPIO0_5zigbee/Wi-Fi 3.3V / R7 B7 GPIO0_24 GPIO GPIO0_24 3.3V / R6 B8 GPIO0_4 GPIO GPIO0_4zigbee/Wi-Fi 3.3V / T7 B9 GPIO0_25 GPIO GPIO0_25Wi-Fi/Mifare 3.3V / P8 B10 GPIO0_3 GPIO GPIO0_3zigbee /Wi-Fi/Mifare 3.3V / U7 B11 GPIO0_26 GPIO GPIO0_26 3.3V / P6 B12 GPIO0_2 GPIO GPIO0_2zigbee /Wi-Fi/Mifare 3.3V / R8 B13 GPIO0_27 GPIO GPIO0_27 3.3V / P7 B14 GPIO0_1 GPIO GPIO0_1zigbee /Wi-Fi/Mifare 3.3V / T8 B15 GPIO0_28 GPIO GPIO0_28 3.3V / L9 B16 GPIO0_0 GPIO GPIO0_0zigbee /Wi-Fi/Mifare 3.3V / U8 B17 GND 0V B18 GND 0V 72

86 / B19 CAN1_TX/GPIO0_18 CAN1 CAN1 3.3V M7 B20 AUART3_TX/GPIO3_13 AUART V L5 B21 CAN1_RX/GPIO0_19 CAN1 CAN1 3.3V M9 B22 AUART3_RX/GPIO3_12 AUART V M5 B23 CAN0_TX/GPIO0_22 CAN0 CAN0 3.3V M8 B24 AUART2_TX/GPIO3_9 AUART V F5 B25 CAN0_RX/GPIO0_23 CAN0 CAN0 3.3V L8 B26 AUART2_RX/GPIO3_8 AUART V F6 B27 GPIO3_15 GPIO GPIO3_15 3.3V / K6 B28 DUART_TX/GPIO3_3 DUART 3.3V J7 B29 GPIO3_14 GPIO GPIO3_14 3.3V / L6 B30 DUART_RX/GPIO3_2 DUART 3.3V J6 B31 GPIO3_11 GPIO GPIO3_11 3.3V / H7 B32 AUART1_TX/GPIO3_5 AUART1 1 Zigbee 3.3V K4 B33 GPIO3_10 GPIO GPIO3_10 3.3V / H6 B34 AUART1_RX/GPIO3_4 AUART1 1 zigbee 3.3V L4 B35 GPIO3_7 GPIO GPIO3_7 3.3V / J5 B36 AUART0_TX/GPIO3_1 AUART V H5 B37 GPIO3_6 GPIO GPIO3_6 3.3V / K5 B38 AUART0_RX/GPIO3_0 AUART V G5 B39 GND 0V B40 GND 0V B41 ADC3 ADC ADC3 1.8V D9 B42 ADC5 ADC ADC5 1.8V D15 B43 ADC2 ADC12 ADC2 1.8V C8 B44 ADC4 ADC12 ADC4 1.8V D13 B45 GPIO1_27 GPIO GPIO1_27 3.3V / P5 B46 GPIO1_24 GPIO GPIO1_24 3.3V / P4 B47 GPIO1_26 GPIO GPIO1_26 3.3V / M4 B48 GPIO1_25 GPIO GPIO1_25 3.3V / K1 B49 GPIO3_28 GPIO GPIO3_28 3.3V / E9 B50 GPIO3_30 GPIO GPIO3_30 3.3V / M6 B51 GPIO1_23 GPIO GPIO1_23 3.3V / R5 B52 GPIO1_22 GPIO GPIO1_22 3.3V / T5 B53 GPIO1_21 GPIO GPIO1_21 3.3V / U5 B54 GPIO1_20 GPIO GPIO1_20 3.3V / R4 B55 GPIO1_19 GPIO GPIO1_19 3.3V / T4 73

87 / B56 GPIO1_18 GPIO GPIO1_18 3.3V / U4 B57 GPIO1_17 GPIO GPIO1_17 3.3V / R3 B58 GPIO1_16 GPIO GPIO1_16 3.3V / T3 B59 GPIO1_15 GPIO GPIO1_15 3.3V / U3 B60 GPIO1_14 GPIO GPIO1_14 3.3V / U2 B61 GPIO1_13 GPIO GPIO1_13 3.3V / T2 B62 GPIO1_12 GPIO GPIO1_12 3.3V / T1 B63 GPIO1_11 GPIO GPIO1_11 3.3V / R2 B64 GPIO1_10 GPIO GPIO1_10 3.3V / R1 B65 GPIO1_9 GPIO GPIO1_9 3.3V / P3 B66 GPIO1_8 GPIO GPIO1_8 3.3V / P2 B67 GPIO1_7 GPIO GPIO1_7 3.3V / P1 B68 GPIO1_6 GPIO GPIO1_6 3.3V / N2 B69 GPIO1_5 GPIO GPIO1_5 3.3V / M3 B70 GPIO1_4 GPIO GPIO1_4 3.3V / M2 B71 GPIO1_3 GPIO GPIO1_3 3.3V / L3 B72 GPIO1_2 GPIO GPIO1_2 3.3V / L2 B73 GPIO1_1 GPIO GPIO1_1 3.3V / K3 B74 GPIO1_0 GPIO GPIO1_0 3.3V / K2 B75 GND 0V B76 GND 0V B77 NC B78 NC NC/ B79 NC B80 NC 4.2 A287 (ARM9 ) A287 A287-W128LIA287-WB128LIA287-W128F256LI-T ZLG NXP ARM9 i.mx MHz DDR2 NandFlashWi-Fi Wi-FiBTUART I 2 CI 2 SEthernetUSB PMU A A287-W128LI A287-WB128LI

88 4.7 A287-W128LI 4.8 A287-WB128LI 4.9 A287 () CPUNXP i.mx MHz 128MB DDR2 128MB NandFlash PMU Linux AWorks SD/MMC U 1 USB2.0 HOST1 USB2.0 OTG 2 10M/100M 6 2 CAN 1 SD Card 1 I²C1 SPI1 I²S 4 12 ADC LCD

89 Wi-Fi802.11b/g/n 4.0 JTAG 6 PCB 30mm48mm 3.3V5% A287 i.mx287ddr2nand FlashWi-FiBT 30mm48mm A A A A287 A287-W128LI A287-WB128LI A287-W128F256LI-T ARM i.mx287 i.mx287 i.mx287 ARM 454MHz 454MHz 454MHz LinuxAWorks LinuxAWorks LinuxAWorks 128MB 128MB 128MB 128MB 128MB 256MB Wi-Fi IEEE b/g/n IEEE b/g/n IEEE b/g/n V4.0 V RGB

90 A287-W128LI A287-WB128LI A287-W128F256LI-T USB 1 HOST1 OTG CAN-Bus 2 2 SD 1 1 SPI 1 2 I 2 C 1 2 ADC 4 8 PWM 1 6 GPIO I/O A287 I/O BSP 4.11 A A1 ~ A80 BB1 ~ B60 A B A A287 A / A1 GND 0V POWER A2 GND 0V A3 nrst_out 3.3V WDG A4 nrst_in 3.3V A5 SPI3_SCK 3.3V A2 A6 SPI3_MOSI 3.3V C2 SPI3 A7 SPI3_MISO 3.3V B2 A8 SPI3_SS V D2 A9 AUART2_TX 2 3.3V C3 A10 AUART3_RX AUART 3 3.3V B3 A11 AUART3_TX 3 3.3V C4 77

91 / A12 AUART2_RX 2 3.3V A3 AUART A13 AUART4_RX 4 3.3V F7 A14 GPIO3_20 GPIO GPIO3_20 3.3V G7 A15 AUART4_TX AUART 4 3.3V E7 A16 GPIO3_21 GPIO3_21 3.3V G6 A17 GPIO3_26 GPIO3_26 3.3V E8 GPIO A18 GPIO3_ V D7 A19 GPIO1_28 GPIO1_28 3.3V L1 A20 RESERVED NC NC A21 ENET1_TXD0 NET V G1 A22 RESERVED NC NC A23 ENET1_TXD V G2 A24 ENET1_RX_EN 3.3V J3 NET1 A25 ENET1_TX_EN 3.3V J4 A26 ENET1_RXD V J1 A27 ENET0_RX_EN NET0 3.3V E4 A28 ENET1_RXD1 NET V J2 A29 ENET0_TXD V F1 A30 ENET0_TXD V F2 A31 ENET0_TX_CLK GPIO 3.3V E3 NET0 A32 ENET0_RXD V H1 A33 ENET0_RX_CLK GPIO 3.3V F3 A34 ENET0_RXD V H2 A35 ENET_MDC 3.3V G4 A36 ENET0_TX_EN NET0 3.3V F4 A37 ENET_MDIO 3.3V / H4 A38 ENET_CLK NET CLK 3.3V E2 A39 GND 0V POWER A40 GND 0V A41 USB_OTG_ID USB OTG OTG ID 3.3V K8 A42 USB_H_N USB HOST N 3.3V / B8 A43 GPIO3_29 GPIO GPIO3_29 3.3V E10 A44 USB_H_P USB1 P 3.3V / A8 A45 USB_OTG_P USB0 OTG P 3.3V / B10 A46 VDD_XTAL POWER 3.3V C12 A47 USB_OTG_N USB OTG N 3.3V / A10 A48 PSWITCH PSWITCH 3.3V A11 A49 GND POWER 0V A50 BOOT_SELECT BOOT SD BT 3.3V 78

92 / A51 WDO_EN WDG 3.3V A52 BOOT_MODE BOOT USB BT 3.3V A53 3.3V A54 3.3V A55 3.3V A56 3.3V 3.3V POWER A57 3.3V A58 3.3V A59 3.3V A60 3.3V A61 USB_DEV_DET DEVICE 5V POWER A62 USB_DEV_DET DEVICE 5V E17 A63 SD_D V / C6 A64 SD_D V / B6 A65 SD_D V / A5 A66 SD_D V / D6 SD A67 SD_WP 3.3V N9 A68 SD_CMD 3.3V A4 A69 SD_CARD_DETE 3.3V D10 A70 SD_SCK 3.3V A6 A71 ADC0 ADC0 3.3V C15 A72 HSADC ADC 3.3V B14 ADC A73 ADC6 ADC6 3.3V C14 A74 ADC1 ADC1 3.3V C9 A75 JTAG_TDO 3.3V E13 A76 JTAG_TCK 3.3V E11 A77 JTAG_TRST 3.3V D14 JTAG A78 JTAG_TMS 3.3V D12 A79 JTAG_RTCK 3.3V E14 A80 JTAG_TDI 3.3V E A287 B / B1 GPIO2_13 GPIO2_13 3.3V C1 B2 GPIO2_12 GPIO2_12 3.3V B1 B3 GPIO2_15 GPIO GPIO2_15 3.3V E1 B4 GPIO2_14 GPIO2_14 3.3V D1 B5 GPIO3_7 GPIO3_7 3.3V J5 79

93 / B6 GPIO3_6 GPIO3_6 3.3V K5 B7 GPIO3_11 GPIO3_11 3.3V H7 B8 GPIO3_10 GPIO3_10 3.3V H6 B9 GPIO3_14 GPIO3_14 3.3V L6 B10 GPIO3_15 GPIO GPIO3_15 3.3V K6 B11 GPIO3_13 GPIO3_13 3.3V L5 B12 GPIO3_12 GPIO3_12 3.3V M5 B13 GPIO3_9 GPIO3_9 3.3V F5 B14 GPIO3_8 GPIO3_8 3.3V F6 B15 AUART1_TX 1 3.3V K4 AUART1 B16 AUART1_RX 1 3.3V L4 B17 AUART0_TX 0 3.3V H5 AUART0 B18 AUART0_RX 0 3.3V G5 B19 DUART_TX 3.3V J7 DUART B20 DUART_RX 3.3V J6 B21 GPIO1_17 GPIO1_17 3.3V R3 GPIO B22 GPIO1_16 PHY 3.3V T3 B23 Factory CFG - 3.3V - -IO1_19 T4 B24 GPIO1_18 GPIO GPIO1_18 3.3V U4 B25 BEEP GPIO 3.3V U5 -IO1_21 B26 REG CFG - 3.3V - -IO1_20 R4 B27 ERR - IO1_23 3.3V R5 GPIO B28 RUN - IO1_22 3.3V T5 B29 I2C1_SDA I 2 C1 3.3V / L7 I 2 C1 B30 I2C1_SCL I 2 C1 3.3V K7 B31 TFT_D1 TFT_B1 3.3V K3 B32 TFT_D0 TFT_B0 3.3V K2 B33 TFT_D3 TFT_B3 3.3V L3 B34 TFT_D2 TFT_B2 3.3V L2 B35 TFT_D5 TFT_G0 3.3V M3 B36 TFT_D4 LCD TFT_B4 3.3V M2 B37 TFT_D7 TFT_G2 3.3V P1 B38 TFT_D6 TFT_G1 3.3V N2 B39 TFT_D9 TFT_G4 3.3V P3 B40 TFT_D8 TFT_G3 3.3V P2 B41 TFT_D11 TFT_R0 3.3V R2 80

94 / B42 TFT_D10 TFT_G5 3.3V R1 B43 TFT_D13 TFT_R2 3.3V T2 B44 TFT_D12 TFT_R1 3.3V T1 B45 TFT_D15 TFT_R4 3.3V U3 B46 TFT_D14 TFT_R3 3.3V U2 B47 TFT_VCLK LCD TFT 3.3V M4 B48 TFT_RESET TFT 3.3V M6 B49 TFT_VSYNC TFT 3.3V P4 B50 TFT_HSYNC TFT 3.3V K1 B51 TFT_PWM 3.3V E9 B52 TFT_VDEN 3.3V P5 B53 TS_XP X 3.3V C8 B54 TS_XM X 3.3V D13 B55 TS_YP Y 3.3V D9 B56 TS_YM Y 3.3V D15 B57 CAN1_RX 3.3V M9 CAN1 B58 CAN1_TX 3.3V M7 B59 CAN0_RX 3.3V L8 CAN0 B60 CAN0_TX 3.3V M8 4.3 A6G2C (A7 ) A6G2CA6G2C-W128LIA6G2C-W256LIA6G2C-WB128LI A6G2C-WB256LIA6G2C-5WB128LI-TA6G2C-Z128F128LI-TA6G2C-M128F128LI-T ZLG NXPCortex-A7528MHzDDR3 NandFlashWi-FizigbeeRFID8UART 2USB OTG2CAN-bus2 A6G2C A6G2C-W256LI A6G2C-WB256LI A6G2C-W256LI 4.13 A6G2C-WB256LI 81

95 A6G2C () CPUNXP Cortex-A7 528MHz 128/256MB DDR3 Flash128/256MB NandFlash Linux AWorks Wi-FizigbeeRFID LCD 1366* CAN-bus 2 10/100M 2 USB2.0 OTG PHY 1 SD/MMC CANUARTI 2 C JTAG 6 PCB 30mm 48mm A6G2C i.mx6ulddr3nandflashwi-fizigbeerfid 30mm48mm A6G2C

96 4.15 A6G2C A6G2C A6G2C A6G2CA6G2C- 5WB128LI-T W128LI W256LI WB256LI Z128F128LI-T M128F128LI-T CPU 6G2CVM05AA 128MB 128MB 256MB 256MB 128MB 128MB 128MB 128MB 256MB 256MB 128MB 128MB LinuxAWorks Wi-Fi 5G Wi-Fi V4.2 V4.0 zigbee RFID 2 USB 2 CAN LCD (RGB565) SD 1 UART I 2 C 1 I 2 C SPI 1 ( 4 ) I 2 S/SAI 2 PWM 2 ( 8 ) ADC 1 2 JTAG GPIO 91 83

97 4.3.5 I/O A6G2C I/O BSP 4.16 J1A1 ~ A80 J2B1 ~ B60 J1 J A6G2C A6G2C J1 / A1 ENET_MDIO 3.3V / K17 A2 ENET_MDC 3.3V L16 A3 ENET1_RXD V E17 A4 ENET2_RXD V C16 A5 ENET1_RXD V F16 A6 ENET2_RXD V C17 A7 ENET1_RXEN 3.3V E16 A8 ENET2_RXEN 3.3V B17 A9 ENET1_RXER ENET1& 3.3V D15 A10 ENET2_RXER ENET2 3.3V D16 A11 ENET1_TXD V E14 A12 ENET2_TXD V A16 A13 ENET1_TXD V E15 A14 ENET2_TXD V A15 A15 ENET1_TXEN 3.3V F15 A16 ENET2_TXEN 3.3V B15 A17 ENET1_TX_CLK 1 3.3V F14 A18 ENET2_TX_CLK 2 3.3V D17 A19 GND 0V GND A20 GND 0V A21 MQS_LEFT B16 A22 MOS_RIGHT A14 A23 UART7_RX UART 3.3V B13 84

98 / A24 UART7_TX 3.3V C13 A25 UART8_RX UART 3.3V B14 A26 UART8_TX 3.3V C14 A27 PWM_OUT6 PWM 3.3V D14 PWM A28 PWM_OUT5 PWM 3.3V A13 A29 LCD_R V D13 A30 LCD_R V A12 A31 LCD_R V B12 A32 LCD_R V C12 A33 LCD_R V D12 A34 LCD_G V E12 A35 LCD_G V A11 A36 LCD_G V B11 LCD A37 LCD_G V D11 A38 LCD_G V A10 A39 LCD_G V B10 A40 LCD_B V C10 A41 LCD_B V D10 A42 LCD_B V E10 A43 LCD_B V A9 A44 LCD_B V B9 A45 0V GND GND A46 0V A47 LCD_PCLK 3.3V A8 A48 LCD_HSYNC 3.3V D9 LCD A49 LCD_DE 3.3V B8 A50 LCD_VSYNC 3.3V C9 A51 GPIO3_4 GPIO GPIO 3.3V / E9 A52 GND GND 0V A53 BT_CFG1_6 01SD 3.3V BOOT A54 BT_CFG1_7 10Nand 3.3V A55 GPIO4_14(ERR) ERR 3.3V B5 GPIO A56 GPIO4_16(RUN) 3.3V E6 A57 UART6_TX UART 3.3V F5 A58 SD1_CD SD1 SD 3.3V J14 A59 UART6_RX UART 3.3V E5 A60 SD1_WP SD 3.3V K15 A61 NC SD1 A62 SD1_CLK SD1 3.3V C1 85

99 / A63 NC A64 SD1_CMD SD1 3.3V C2 A65 NC A66 SD1_DATA V / B3 A67 NC SD1 A68 SD1_DATA V / B2 A69 NC A70 SD1_DATA V / B1 A71 NC A72 SD1_DATA V / A2 A73 SPI1_SCK SPI 3.3V D4 A74 SPI1_SS0 SPI 3.3V D3 SPI1 A75 SPI1_MOSI 3.3V D2 A76 SPI1_MISO 3.3V D1 A77 GND GND 0V A78 5V_IN POWER 5V 5V A79 GND GND 0V A80 5V_IN POWER 5V 5V 4.9 A6G2C J2 / B1 BOOT_MODE V T10 BOOT B2 BOOT_MODE V U10 B3 nrst_out 3.3V RESET B4 nrst_in 3.3V B5 WDO_EN 3.3V B6 MX6_ONOFF / 3.3V R9 B7 CAN1_TX 3.3V H15 CAN1/CAN2 B8 CAN1_RX 3.3V G14 B9/B10 B9 CAN2_TX 3.3V J15 B10 CAN2_RX 3.3V H14 B11 NC NC B12 GPIO5_1(Factory) GPIO GPIO 3.3V / R9 B13 I2C_SDA I 2 C 3.3V / N9 B14 GPIO5_2(CLR) GPIO GPIO 3.3V / P11 B15 NC NC B16 GPIO5_4 GPIO GPIO 3.3V / P9 B17 I2C_SCL I 2 C 3.3V N10 86

100 / B18 GPIO5_3 GPIO 3.3V / P10 GPIO B19 GPIO5_6 GPIO 3.3V / N11 B20 GND GND 0V B21 USB_OTG1_VBUS VBUS 5V T12 B22 USB_OTG2_VBUS USB1&USB2 VBUS 5V U12 B23 USB_OTG1_ID ID 3.3V K13 B24 USB_OTG2_ID ID 3.3V M17 B25 USB_OTG1_D_N 3.3V / T15 B26 USB_OTG2_D_N 3.3V / T13 USB1&USB2 B27 USB_OTG1_D_P 3.3V / U15 B28 USB_OTG2_D_P 3.3V / U13 B29 nusb_otg_chd 3.3V U16 B30 GND 0V GND B31 GND 0V B32 JTAG_TCK JTAG 3.3V M14 B33 PMIC_ON_REQ 3.3V T9 B34 JTAG_nTRST JTAG 3.3V N14 B35 CCM_CLK1_N 3.3V P16 B36 JTAG_TMS JTAG 3.3V P14 B37 CCM_CLK1_P 3.3V P17 B38 JTAG_TDI JTAG 3.3V N16 B39 ADC_CH9 ADC ADC 9 M15 B40 JTAG_TDO JTAG 3.3V N15 B41 ADC_CH8 ADC ADC 8 N17 B42 JTAG_MOD JTAG 3.3V P15 B43 VREF_ADC ADC M13 B44 GND GND 0V B45 UART1_TX 3.3V K14 B46 UART1_RX 3.3V K16 B47 UART2_TX 3.3V J17 B48 UART2_RX UART 5.0V J16 B49 UART3_TX B47/B48 3.3V H17 B50 UART3_RX 3.3V H16 B51 UART4_TX 3.3V G17 B52 UART4_RX 3.3V G16 B53 UART5_TX 3.3V F17 B54 UART5_RX 3.3V G13 B55 TS_XN X 3.3V L17 TOUCH B56 TS_XP X 3.3V M16 87

101 / B57 TS_YN Y 3.3V L15 TOUCH B58 TS_YP Y 3.3V L14 B59 GND GND 0V B60 3V_BAT RTC 4.4 A3352 (A8 ) A3352 A3352-W128LIA3352-WB128LIA3352-M128F128LI-T ZLG SoC AM3352 Wi-FiBT4.0RFID 800MHz A UART2 CAN-Bus2 USB2 A a A b A3352 () CPUTI AM MHz 128MB DDR2 128MB NandFlash Linux AWorks SD/MMC U 1 USB OTG1 USB HOST 1 1 Wi-FiBT4.0RFID 16bpp RGB565,

102 6 1 2 CAN-bus 1 SD Card I 2 C2 SPI4 12 ADC3 PWM 6 PCB 35mm48mm 5V±3% A3352 Cortex-A8 AM3352DDR2NandFlashWi-FiBT4.0 RFID 35mm48mm A A A A3352 A3352-W128LI A3352-WB128LI A3352-M128F128LI-T LinuxAWorks LinuxAWorks LinuxAWorks ARM Cortex-A8 AM3352 Cortex-A8 AM3352 Cortex-A8 AM3352 ARM 800MHz 800MHz 800MHz 128MB 128MB 128MB 128MB 128MB 128MB Wi-Fi b/g/n b/g/n BT V4.0 89

103 A3352-W128LI A3352-WB128LI A3352-M128F128LI-T RFID 16bpp RGB bpp RGB bpp RGB USB 1 OTG1 HOST 1 OTG1 HOST 1 OTG1 HOST CAN-Bus SD SPI I 2 C ADC 4 12bit 4 12bit 4 12bit PWM GPIO I/O A3352 I/O BSP 4.19 AA1 ~ A80 BB1 ~ B80 A B 4.19 A A3352 (A) / A1 A2 A3 A4 A5 A6 NC NC 90

104 / A7 TFT_HSYNC TFT 3.3V R5 A8 TFT_B0 16bit TFT 0 3.3V R1 A9 TFT_VCLK TFT 3.3V V5 A10 TFT_B1 16bit TFT 1 3.3V R2 LCD A11 TFT_VSYNC TFT 3.3V U5 A12 TFT_B2 16bit TFT 2 3.3V R3 A13 TFT_VDEN TFT 3.3V R6 A14 TFT_B3 16bit TFT 3 3.3V R4 A15 GND POWER 0V A16 TFT_B4 LCD 16bit TFT 4 3.3V T1 A17 NETPHY_RXCLK RMII1_REF_ CLK 3.3V H18 A18 TFT_G0 LCD 16bit TFT 0 3.3V T2 A19 NETPHY_RXDV MII1_CRS 3.3V H17 A20 TFT_G1 LCD 16bit TFT 1 3.3V T3 A21 NETPHY_TXE# MII1_TX_EN 3.3V J16 A22 TFT_G2 LCD 16bit TFT 2 3.3V T4 A23 NETPHY_RXER MII1_RX_ER 3.3V J15 A24 TFT_G3 LCD 16bit TFT 3 3.3V U1 A25 NETPHY_TXD1 MII1_TXD V K16 A26 TFT_G4 LCD 16bit TFT 4 3.3V U2 A27 NETPHY_TXD0 MII1_TXD V K17 A28 TFT_G5 LCD 16bit TFT 5 3.3V U3 A29 NETPHY_RXD1 MII1_RXD V L15 A30 TFT_R0 LCD 16bit TFT 0 3.3V U4 A31 NETPHY_RXD0 MII1_RXD V M16 A32 TFT_R1 LCD 16bit TFT 1 3.3V V2 A33 GND POWER 0V A34 TFT_R2 LCD 16bit TFT 2 3.3V V3 A35 MII_MDC MDIO PHY 3.3V M18 A36 TFT_R3 LCD 16bit TFT 3 3.3V V4 A37 MII_MDIO MDIO PHY 3.3V / M17 A38 TFT_R4 LCD 16bit TFT 4 3.3V T5 A39 GND POWER 0V A40 GND POWER 0V A41 GPMC_A0 RGMII2 RGMII_TCTL 3.3V R13 A42 GPMC_D0 GPMC GPMC 0 3.3V / U7 91

105 / A43 GPMC_A1 RGMII3 RGMII_RCTL 3.3V V14 A44 GPMC_D1 GPMC GPMC 1 3.3V / V7 A45 GPMC_A2 RGMII4 RGMII_TXD3 3.3V U14 A46 GPMC_D2 GPMC GPMC 2 3.3V / R8 A47 GPMC_A3 RGMII5 RGMII_TXD2 3.3V T14 A48 GPMC_D3 GPMC GPMC 3 3.3V / T8 A49 GPMC_A4 RGMII6 RGMII_TXD1 3.3V R14 A50 GPMC_D4 GPMC GPMC 4 3.3V / U8 A51 GPMC_A5 RGMII7 RGMII_TXD0 3.3V V15 A52 GPMC_D5 GPMC GPMC 5 3.3V / V8 A53 GPMC_A6 RGMII8 RGMII_TCLK 3.3V U15 A54 GPMC_D6 GPMC GPMC 6 3.3V / R9 A55 GPMC_A7 RGMII9 RGMII_RCLK 3.3V T15 A56 GPMC_D7 GPMC GPMC 7 3.3V / T9 A57 GPMC_A8 RGMII10 RGMII_RXD3 3.3V V16 A58 GND POWER 0V A59 GPMC_A9 RGMII11 RGMII_RXD2 3.3V U16 A60 GPMC_nBE0_CLE GPMC GPMC 3.3V T6 A61 GPMC_A10 RGMII12 RGMII_RXD1 3.3V T16 A62 GPMC_nWE GPMC GPMC 3.3V U6 A63 GPMC_A11 RGMII13 RGMII_RXD0 3.3V V17 A64 GPMC_nAVD_ALE GPMC GPMC 3.3V R7 A65 GPMC_nWAIT0 GPMC GPMC 0 3.3V T17 A66 GPMC_nOE GPMC GPMC 3.3V T7 A67 GPIO1_28 ZLG 3.3V U18 A68 GPMC_nWP GPMC GPMC 3.3V U17 A69 USB0_D_P USB0 USB0 D+ 3.3V / N17 A70 USB1_DRVVBUS USB1 USB1 VBUS 3.3V F15 A71 USB0_D_N USB0 USB0 D- 3.3V / N18 A72 USB1_D_P USB1 USB0 D+ 3.3V / R17 A73 USB0_DRVVBUS USB0 USB0 VBUS 3.3V F16 A74 USB1_D_N USB1 USB0 D- 3.3V / R18 A75 USB0_VBUS USB0 USB0 VBUS 5.0V P15 A76 USB1_ID USB1 USB1 ID 3.3V P17 A77 USB0_ID USB0 USB0 ID 3.3V P16 A78 USB1_CE USB1 USB1 3.3V P18 A79 USB0_CE USB0 USB0 3.3V M15 A80 USB1_VBUS USB1 USB1 VBUS 5.0V T18 92

106 4.12 A3352 (B) / B1 B2 VDD_5.0 5V 5V B3 POWER B4 B5 GND 0V B6 B7 MMC0_D3 SD SD 3 3.3V / F17 B8 nrstout Reset Out Reset_Out 3.3V A10 B9 MMC0_D2 SD SD 2 3.3V / F18 B10 Vref_ADC ADC ADC B11 MMC0_D1 SD SD 1 3.3V / G15 B12 I2C2_SDA I 2 C I 2 C2_SDA 3.3V / A17 B13 MMC0_D0 SD SD 0 3.3V / G16 B14 I2C2_SCL I 2 C I 2 C2_SCL 3.3V B17 B15 MMC0_nCD SD SD 3.3V C15 B16 I2C1_SCL I 2 C I 2 C1_SCL 3.3V A16 B17 MMC0_CLK SD SD 3.3V G17 B18 I2C1_SDA I 2 C I 2 C1_SDA 3.3V / B16 B19 MMC0_CMD SD SD 3.3V / G18 B20 GND POWER 0V B21 GPIO1_13 GPIO GPIO1_13 3.3V / R12 B22 EMU4 EMU4/GPM C_nCS3 GPIO2_0 3.3V T13 B23 GPIO1_14 GPIO GPIO1_14 3.3V / V13 B24 EMU2 SD GPIO GPIO0_19 SD 3.3V A15 B25 GPIO0_7 GPIO GPIO0_7 3.3V C18 B26 EMU3 GPIO GPIO0_20 3.3V D14 B27 NAND/SD NAND SD 3.3V R3 B28 EMU0 EMU EMU0 3.3V / C14 B29 PWR_OK 3.3V 3.3V 3.3V B30 EMU1 EMU EMU1 3.3V / B14 B31 WDO_EN 3.3V / B32 GND POWER 0V 93

107 / B33 nrst_in nrst_in 3.3V GPIO3_21WCE7 MCASP0_AHCLK B34 3.3V A14 X GPIO GPIO B35 GND POWER 0V B36 MCASP0_AXR1 MCASP 1 3.3V / D13 B37 UART0_TXD UART UART0 3.3V E16 B38 MCASP0_FSR MCASP 3.3V C13 B39 UART0_RXD UART UART0 3.3V E15 B40 MCASP0_ACLKX MCASP 3.3V A13 B41 UART1_TXD UART UART1 3.3V D15 B42 MCASP0_FSX MCASP 3.3V B13 B43 UART1_RXD UART UART1 3.3V D16 MCASP0_AHCLK B44 GPIO3_17 3.3V C12 R GPIO B45 UART2_TXD UART UART2 3.3V L18 B46 MCASP0_ACLKR MCASP 3.3V B12 B47 UART2_RXD UART UART2 3.3V K18 B48 MCASP0_AXR0 MCASP 0 3.3V / D12 B49 UART3_TXD UART UART3 3.3V L16 B50 GND POWER 0V B51 UART3_RXD UART UART3 3.3V L17 B52 JTAG_TCK JTAG TAP 3.3V A12 B53 UART4_TXD UART UART4 3.3V K15 B54 JTAG_TDO JTAG TAP 3.3V A11 B55 UART4_RXD UART UART4 3.3V J18 B56 JTAG_TDI JTAG TAP 3.3V B11 B57 UART5_TXD UART UART5 3.3V J17 B58 JTAG_TMS JTAG TAP 3.3V C11 B59 UART5_RXD UART UART5 3.3V H16 B60 JTAG_nTRST JTAG TAP 3.3V B10 B61 CAN0_TXD CAN CAN0 3.3V D18 B62 AI_7 ADC 1.8V C9 B63 CAN0_RXD CAN CAN0 3.3V D17 B64 AI_6 ADC 1.8V A8 B65 CAN1_TXD CAN CAN1 3.3V E18 B66 AI_5 ADC 1.8V B8 B67 CAN1_RXD CAN CAN1 3.3V E17 94

108 / B68 AI_4 ADC 1.8V C8 B69 NC NC B70 AI_3 TOUCH YNLR 1.8V A7 B71 NC NC B72 AI_2 TOUCH YPLL 1.8V B7 B73 NC NC B74 AI_1 TOUCH XNUR 1.8V C7 B75 NC NC B76 AI_0 TOUCH XPUL 1.8V B6 B77 NC NC B78 GND POWER 0V B79 NC NC B80 VBAT RTC CPU RTC CPU RTC 3.0V CPU Z zigbeew Wi-FiW5 5G Wi-Fi B BlutoothM RFID 64 64MB FLash F8 FLash 8MB FLash 13 (1) A280-Z64F8AWI-T (2) A280-W64F8AWI-T (3) A280-M64F8AWI-T (4) A287-W128LI (5) A287-WB128LI (6) A287-W128F256LI-T (7) A6G2C-5WB128LI-T (8) A6G2C-W256LI (9) A6G2C-WB128LI (10) A6G2C-WB256LI (11) A6G2C-Z128F128LI-T (12) A3352-W128LI (13) A3352-WB128LI 95

109 4.13 ARM9 & Cortex-A A280- A287- A6G2C- A3352- Z W M W WB W 5WB W WB WB Z W WB F8 F8 F8 F256 F128 AWI-T AWI-T AWI-T LI LI LI-T LI-T LI LI LI LI-T LI LI CPU i.mx28 i.mx287 6G2CVM05AA AM3352 CPU 454MHz 528MHz 800MHz Flash(MB) (MB) AWorks LinuxAWorks zigbee Wi-Fi G Wi-Fi RFID CAN UART I 2 C I 2 C 2 SPI 1 2 USB 2 SD 2 1 LCD RGB CSI D/3D I 2 S/SAI PWM ADC GPIO JTAG -40 ~ -30 ~ ~ -30 ~ mm 3548mm 96

110 5ARM9&Cortex-A ARM9Cortex-A zigbeelorawi-figprs3g/4g CAN-busRS232RS485 IoT 5.1 i.mx28x (ARM9 ) i.mx28x EPC-287C-LEPC-283C-LEPC-280I-LIoT-A28LI ZLG Freescale ARM9 i.mx280i.mx283i.mx MHz 128MB DDR2 128MB NandFlash 6 UART1 1 I 2 C2 SPI 4 12bit ADC 1 ADC2 10/100M 1 SD 1 I 2 S 1 USB HOST1 USB OTG 4 16 TFT Wi-Fi b/g/n 4.0 i.mx28x ZLG Linux AWorks BSP DEMO Linux AWorks i.mx28x Linux AWorks i.mx28x IoT-A28LI IoT-A28LI 97

111 5.1.2 CPUi.MX280/3/7 454MHz 128MB DDR2 SDRAM 128MB NandFlash Linux AWorks b/g/n 4.0 USB 2.01 HOST1 OTG 5 1 CAN-bus 2 CAN 2.0B L2 10/100M SD SPII 2 CI 2 S 4 12bitADC 1 ADC 4 TFT A28 6 PCB 75 mm122 mm i.mx28x i.mx28x EPC-287C-L EPC-283C-L EPC-280I-L IoT-A28LI LinuxAWorks LinuxAWorks LinuxAWorks LinuxAWorks CPU Freescale i.mx287 Freescale i.mx283 Freescale i.mx280 Freescale i.mx MHz 454MHz 454MHz 454MHz 128MB 128MB 64MB 128MB NAND Flash 128MB 128MB 128MB 128MB Wi-Fi IEEE b/g/n V x x x 480 TTL CAN USB Device 1 Host0 1 Host0 1 Host0 1 Host0 USB Host TF

112 EPC-287C-L EPC-283C-L EPC-280I-L IoT-A28LI SPI I 2 C GPIO 14~37 9~24 5~24 14~30 ADC 4, 12bit 4, 12bit 8, 12bit 4, 12bit I 2 S IoT-3968L (ARM9 ) IoT-3968L ZLG IoT NXP i.mx287 ARM9 454MHz 128MB DDR2 128MB NandFlashIoT-3968L IoT MiniPCIE zigbeelora Wi-FiGPRS3G/4GCAN-busRS232RS485 & IoT USBTF IoT-3968L DEMO IoT IoT-3968L IoT-3968L 99

113 5.2.2 CPUNXP ARM9 i.mx MHz 128MB DDR2 128MB NandFlash Linux AWorks 1 TF 2 10/100M 2 CAN 2 MiniPCIE PCIE-ZW6201 (Wi-Fi)PCIE-ZM5161(zigbee) PCIE-MP1278LoRaPCIE-SIM800G(GPRS)U9300C (2G/3G/4G) 5 TTL UART 1 TTL 1 USB Host 16 bit TFT 800 x 480 JTAG 16 GPIO 4 UART 4 ADC 1 102mm146mm 9V~36V 5.3 Cortex-A7 (A7 ) Cortex-A7 EPC-6G2C-LIoT-6G2C-L Freescale ARM Cortex-A7 i.mx6ul 528MHz DDR3 NandFlash 1 Wi-Fi8 UART2 CAN1 I 2 C2 12bit ADC2 10/100M 1 SDIO1 2 USB Host USB Device USB OTG1 USB Device 1 8 CSI Cortex-A7 ZLG Linux BSP Linux i.mx6ul Linux Linux ARMfreescaleCSDN Linux EPC-6G2C-L

114 EPC-6G2C-L Freescale ARM Cortex-A7 i.mx6ul 528MHz Linux AWorks 128MB/256MB DDR3 128MB/256MB NandFlash 2 USB2.0 HostUSB Host1 USBDevice 2 10M/100M Wi-Fi 1 SD(TF ) I²C1 SPI 2 12 ADC 16 TFT 4 PC104 75mm122mm 6 PCB 30mm48mm 12V2% Cortex-A

115 5.2 Cortex-A7 EPC-6G2C-L IoT-6G2C-L Freescale Cortex-A7 Freescale Cortex-A7 LinuxAWorks LinuxAWorks 528MHz 528MHz 256M 256M 256M 256M LCD x x USB Host 2 2 USB Device 1 ( USB HOST0 ) 1 ( USB HOST0 ) 8 ( 1 ) 8 ( 1 ) CAN-Bus /100Mbps 2 10/100Mbps 1 1 ADC TF 1 1 I 2 C 1 I 2 C 1 I 2 C SPI CSI 1 CSI GPIO Wi-Fi 75mm x 122mm 75mm x 122mm 5.4 IoT7000A-LI (A7 ) IoT7000A-LI ZLG IoT NXP Cortex-A7 i.mx6ul 528MHz 256MB DDR3 256MB NandFlashIoT7000A-LI IoT MiniPCIE zigbeelorawi-figprs3g/4gcan-busrs232rs485 & IoT USB TF IoT7000A-LI DEMO IoT

116 IoT7000A-LI CPUNXP Cortex-A7 i.mx6ul 528MHz 256M Byte DDR3 256M Byte NandFlash Linux AWorks 1 TF 2 10/100M 1 CAN 1 RS485 2 MiniPCIE PCIE-ZW6201 (Wi-Fi)PCIE-ZM5161(zigbee) PCIE-MP1278LoRaPCIE-SIM800G(GPRS)U9300C (2G/3G/4G) 5 TTL UART 1 TTL 1 USB Host 16 bit TFT 1366 x 768 JTAG 16 GPIO 4 UART 1 CAN 1 102mm146mm 9V~36V 103

117 5.5 IoT-A3352LI (A8 ) IoT-A3352LI ZLG IoT TI Cortex-A8 800MHz 128MB DDR2 128MB NandFlashIoT-A3352LI IoT PC104 Wi-FiCAN-busRS232RS485 & IoT USBTF IoT-A3352LI DEMO IoT IoT-A3352LI IoT-A3352LI CPUTI Cortex-A8 AM MHz 128MB DDR2 128MB NandFlash Linux AWorks 1 TF 1 10/100M M 104

118 TCP/IP Wi-Fi 6 TTL UART 1 TTL 1 USB Host 1 USB Device/USB Host 16 bit TFT JTAG 2 CAN-Bus 1 SD Card I 2 C2 SPI4 12 ADC3 PWM 1 1 RTC 75mm122mm 5.6 IoT3000A-AWI IoT3000A-AWI ZLG IoT Freescale ARM9 i.mx28 454MHz 64MB DDR2 8MB SPI FLASHIoT3000A-AWI IoT MiniPCIE zigbeelorawi-figprs3g/4gcan-bus RS232RS485 & IoT USBTF IoT3000A-AWI DEMO IoT IoT3000A-AWI

119 5.6 IoT3000A-AWI CPUi.MX28 64MB DDR2 8MB SPI Flash AWorks 2 10/100M 2 CAN 1 USB Host 1 TF 2 MiniPCIE PCIE-ZW6201 (WI-FI)PCIE-ZM5161(zigbee) PCIE-MP1278LoRaPCIE-SIM800G(GPRS)U9300C (2G/3G/4G) 5 TTL UART 1 TTL 1 USB Host JTAG 37 GPIO 4 UART 2 CAN 1 102mm146mm 9V~36V 106

120 ARM9 & Cortex-A EPC- EPC- EPC- IoT- EPC- IoT- IoT- IoT- IoT3000 IoT C-L 283C-L 280I-L A28LI 6G2C-L 6G2C-L A3352LI 3968L A-AWI A-LI CPU ARM9 Cortex-A7 Cortex-A8 ARM9 Cortex-A7 MCIM CPU i.mx287 i.mx283 i.mx280 i.mx287 MCIM6G2C AM3352 i.mx287 i.mx28 6G2C CPU 454MHz 528MHz 800MHz 454MHz 528MHz Flash(MB) (MB) LinuxAWorks AWorks Linux AWorks zigbee Wi-Fi LoRa CAN UART USB 2 TF 1 LCD/ RGB(565) RGB(565) -- RGB(565) GPIO 14 ~ 37 9 ~ 24 5 ~ ~ 30 () () () () 31 () 16 75mm 122mm 102mm 146mm 107

121 108

122 6 AWorks LED AWorks 6.1 LED AWorks LED LED aw_led.h aw_err_t aw_led_set (int id, aw_bool_t on); aw_err_t aw_led_on(int id); aw_err_t aw_led_off(int id); aw_err_t aw_led_toggle(int id); LED LED LED LED 1 LED LED aw_err_t aw_led_set (int id, aw_bool_t on); id LED LED ID 0 LED 2 LED LED 0~1 on LED AW_TRUE LED AW_FALSE LED aw_bool_t AWorks aw_types.h AW_TRUEAW_FALSE 0 LED aw_led_set() LED 1 aw_led_set(0, AW_TRUE); 0 LED aw_led_set() LED 1 aw_led_set(0, AW_FALSE); aw_err_t aw_errno.h aw_err_t AW_OK 0 AW_OK aw_common.h 0 #define AW_OK 0 109

123 aw_errno.h aw_errno.h AW_EPERM AW_EINVAL AW_ENOENT AW_ENOTSUP AW_EIO I/O AW_EAGAIN AW_ENODEV AW_ENOSPC LED LED 100 LED -AW_ENODEVAW_ENODEV ID ID 1 aw_err_t ret = aw_led_set(100, AW_TRUE); 2 if (ret!= AW_OK) { // 3 if (ret == -AW_ENODEV) { // 4 // 5 } 6 } LED LED AW_OK 2 LED LED aw_err_t aw_led_on(int id); id LED 0 LED aw_led_on() 1 aw_led_on(0); 3 LED LED aw_err_t aw_led_off(int id); id LED 0 LED aw_led_off() 1 aw_led_off(0); 4 LED LED LED aw_err_t aw_led_toggle(int id); 110

124 id LED LED LED aw_led_toggle() 1 while (1) { 2 aw_led_toggle(0); // LED0 3 aw_mdelay(500); // 500ms 4 } LED 6.7 LED 1 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_led.h" 4 5 int aw_main (void) 6 { 7 while (1) { 8 // aw_led_on() aw_led_off() LED 9 aw_led_on(0); 10 aw_mdelay(500); 11 aw_led_off(0); 12 aw_mdelay(500); 13 // aw_led_set() LED 14 aw_led_set(0, TRUE); 15 aw_mdelay(500); 16 aw_led_set(0, FALSE); 17 aw_mdelay(500); 18 // aw_led_toggle() LED 19 aw_led_toggle(0); 20 aw_mdelay(500); 21 aw_led_toggle(0); 22 aw_mdelay(500); 23 } 24 } 6.2 AWorks ZLG

125 AWorks aw_err_t aw_input_handler_register ( aw_input_handler_t aw_input_cb_t void *p_input_handler, pfn_cb, *p_usr_data); p_input_handler pfn_cb p_usr_data pfn_cb p_usr_data 1 p_input_handler aw_input_handler_t aw_input.h aw_input_handler_t key_handler; // key_handler p_input_handler 2 pfn_cb aw_input_cb_t aw_input.h typedef void (*aw_input_cb_t)( aw_input_event_t *p_input_data, void *p_usr_data); pfn_cb p_input_data p_usr_data p_usr_data p_usr_data NULL p_input_data aw_input_event_t aw_input_event_t aw_input.h 1 typedef struct aw_input_event { 2 int ev_type; // 3 } aw_input_event_t; AW_INPUT_EV_KEY AW_INPUT_EV_ABS p_input_data ev_type AW_INPUT_EV_KEY aw_input_key_data_t aw_input.h 1 typedef struct aw_input_key_data { 2 aw_input_event_t input_ev; // 3 int key_code; // 4 int key_state; // 5 int keep_time; // ms 112

126 6 } aw_input_key_data_t; input_ev aw_input_event_t aw_input_key_data_t aw_input_event_t key_code 4 KEY_0KEY_1KEY_2KEY_3 aw_input_code.h key_state 0 keep_time ms 3 keep_time 0 keep_time keep_time -1 p_input_data aw_input_key_data_t void key_process (aw_input_event_t *p_input_data, void *p_usr_data) 2 { 3 if (p_input_data->ev_type == AW_INPUT_EV_KEY) { // 4 // 5 aw_input_key_data_t *p_data = (aw_input_key_data_t *)p_input_data; 6 // 7 // key_code : p_data->key_code 8 // key_state : p_data->key_state 9 // keep_time : p_data->keep_time 10 } 11 } aw_input_event_t aw_input_event_t 6.1 aw_input_prt_data_t

127 KEY_0 LED0 LED0 LED void key_process (aw_input_event_t *p_input_data, void *p_usr_data) 2 { 3 if (p_input_data->ev_type == AW_INPUT_EV_KEY) { // 4 // 5 aw_input_key_data_t *p_data = (aw_input_key_data_t *)p_input_data; 6 if (p_data->key_code == KEY_0) { // KEY_0 7 if (p_data->key_state!= 0) { // 0 8 aw_led_on(0); // LED0 9 } else { // 0 10 aw_led_off(0); // LED0 11 } 12 } 13 } 14 } 3sLED0 LED0 LED void key_process (aw_input_event_t *p_input_data, void *p_usr_data) 2 { 3 if (p_input_data->ev_type == AW_INPUT_EV_KEY) { // 4 // 5 aw_input_key_data_t *p_data = (aw_input_key_data_t *)p_input_data; 6 if (p_data->key_code == KEY_0) { // KEY_0 7 if ((p_data->key_state!= 0) && (p_data->keep_time == 3000)) { // 3s 8 aw_led_toggle(0); // LED0 9 } 10 } 11 } 12 } aw_input_handler_register() pfn_cb #include "aworks.h" 2 #include "aw_led.h" 3 #include "aw_delay.h" 4 #include "aw_input.h" 5 114

128 6 static void key_process (aw_input_event_t *p_input_data, void *p_usr_data) 7 { 8 if (p_input_data->ev_type == AW_INPUT_EV_KEY) { // 9 // 10 aw_input_key_data_t *p_data = (aw_input_key_data_t *)p_input_data; 11 if (p_data->key_code == KEY_0) { // KEY_0 12 if (p_data->key_state!= 0) { // 0 13 aw_led_on(0); // LED0 14 } else { // 0 15 aw_led_off(0); // LED0 16 } 17 } 18 } 19 } int aw_main() 22 { 23 static aw_input_handler_t key_handler; 24 aw_input_handler_register(&key_handler, key_process, NULL); 25 while(1) { 26 aw_mdelay(1000); 27 } 28 } 6.11 key_process() #include "aworks.h" 2 #include "aw_input.h" 3 4 static void key0_process(aw_input_event_t *p_input_data, void *p_usr_data) 5 { 6 if (p_input_data->ev_type == AW_INPUT_EV_KEY) { 7 aw_input_key_data_t *p_data = (aw_input_key_data *)p_input_data; 8 if (p_data->key_code == KEY_0) { // KEY_0 9 // 0 10 } 11 } 12 } static void key1_process(aw_input_event *p_input_data, void *p_usr_data) 15 { 115

129 16 if (p_input_data->ev_type == AW_INPUT_EV_KEY) { 17 aw_input_key_data_t *p_data = (aw_input_key_data *)p_input_data; 18 if (p_data->key_code == KEY_1) { // KEY_1 19 // 1 20 } 21 } 22 } static void key2_process(aw_input_event_t *p_input_data, void *p_usr_data) 25 { 26 if (p_input_data->ev_type == AW_INPUT_EV_KEY) { 27 aw_input_key_data_t *p_data = (aw_input_key_data_t *)p_input_data; 28 if (p_data->key_code == KEY_2) { // KEY_2 29 // 2 30 } 31 } 32 } static void key3_process(aw_input_event_t *p_input_data, void *p_usr_data) 35 { 36 if (p_input_data->ev_type == AW_INPUT_EV_KEY) { 37 aw_input_key_data_t *p_data = (aw_input_key_data_t *)p_input_data; 38 if (p_data->key_code == KEY_3) { // KEY_3 39 // 3 40 } 41 } 42 } static aw_input_handler_t g_key0_handler; 45 static aw_input_handler_t g_key1_handler; 46 static aw_input_handler_t g_key2_handler; 47 static aw_input_handler_t g_key3_handler; int aw_main (void) 50 { 51 aw_input_handler_register(&g_key0_handler, input_key0_proc, NULL); 52 aw_input_handler_register(&g_key1_handler, input_key1_proc, NULL); 53 aw_input_handler_register(&g_key2_handler, input_key2_proc, NULL); 54 aw_input_handler_register(&g_key3_handler, input_key3_proc, NULL); 55 while (1){ 56 aw_mdelay(1000); 57 } 58 } 116

130 6.3 AWorks aw_buzzer.h aw_err_t aw_buzzer_loud_set (unsigned int beep_level); aw_err_t aw_buzzer_on (void); aw_err_t aw_buzzer_off (void); aw_err_t aw_buzzer_beep (uint32_t ms); aw_err_t aw_buzzer_beep_async (uint32_t ms); 1 aw_err_t aw_buzzer_loud_set (unsigned int beep_level); beep_level 0 ~ % aw_buzzer_loud_set() 1 aw_buzzer_loud_set(80); aw_buzzer_on() aw_buzzer_beep() 0 -AW_ENOTSUP 2 aw_err_t aw_buzzer_on(void); aw_buzzer_on() 1 aw_buzzer_on(); 0 3 aw_err_t aw_buzzer_off(void); aw_buzzer_off() 1 aw_buzzer_off(); 4 117

131 aw_err_t aw_buzzer_beep(uint32_t ms); aw_buzzer_beep() 1 aw_buzzer_beep(50); 50ms 5 aw_buzzer_beep() aw_err_t aw_buzzer_beep_async(uint32_t ms); aw_buzzer_beep_async() 1 aw_buzzer_beep_async(50); aw_buzzer_beep() #include "aworks.h" 2 #include "aw_buzzer.h" 3 #include "aw_delay.h" 4 #include "aw_input.h" 5 6 static void key_process (aw_input_event_t *p_input_data, void *p_usr_data) 7 { 8 if (p_input_data->ev_type == AW_INPUT_EV_KEY) { // 9 // 10 aw_input_key_data_t *p_data = (aw_input_key_data_t *)p_input_data; 11 if (p_data->key_code == KEY_0) { // KEY_0 12 if (p_data->key_state!= 0) { // 0 13 aw_buzzer_on(); // 14 } else { // 0 15 aw_buzzer_off(); // 16 } 17 } 18 } 19 } int aw_main() 118

132 22 { 23 static aw_input_handler_t key_handler; 24 aw_input_handler_register(&key_handler, key_process, NULL); 25 aw_buzzer_loud_set(100); // while(1) { 26 aw_mdelay(1000); 27 } 28 } aw_buzzer_beep() static void key_process (aw_input_event_t *p_input_data, void *p_usr_data) 2 { 3 if (p_input_data->ev_type == AW_INPUT_EV_KEY) { 4 aw_input_key_data_t *p_data = (aw_input_key_data_t *)p_input_data; 5 if (p_data->key_code == KEY_0) { 6 if (p_data->key_state!= 0) { 7 aw_buzzer_beep(50); // 8 } 9 } 10 } 11 } aw_buzzer_beep() aw_buzzer_beep() aw_buzzer_beep_async() static void key_process (aw_input_event_t *p_input_data, void *p_usr_data) 2 { 3 if (p_input_data->ev_type == AW_INPUT_EV_KEY) { 4 aw_input_key_data_t *p_data = (aw_input_key_data_t *)p_input_data; 5 if (p_data->key_code == KEY_0) { 6 if (p_data->key_state!= 0) { 7 aw_buzzer_beep_async(50); // 8 } 9 } 10 } 11 } 119

133 6.4 AWorks aw_digitron_disp.h aw_err_t aw_digitron_disp_decode_set (int uint16_t id, (*pfn_decode)(uint16_t ch)); aw_err_t aw_digitron_disp_blink_set (int id, int index, aw_bool_t blink); aw_err_t aw_digitron_disp_at (int id, int index, uint16_t seg); aw_err_t aw_digitron_disp_char_at (int id, int index, const char ch); aw_err_t aw_digitron_disp_str (int id, int index, int len, const char *p_str); aw_err_t aw_digitron_disp_clr (int id); aw_err_t aw_digitron_disp_enable (int id); aw_err_t aw_digitron_disp_disable (int id); 1 aw_err_t aw_digitron_disp_decode_set (int id, uint16_t (*pfn_decode) (uint16_t ch)); id id MiniPort-View 0 3 id 0 ~ 2 id 0 pfn_decode uint16_t uint16_t 8 '0' ~ '9'AWorks 8 '0' ~ '9' 'A' 'B' 'C' 'D' 'E' 'F' aw_digitron_disp.h uint16_t aw_digitron_seg8_ascii_decode (uint16_t ascii_char); pfn_decode aw_digitron_disp_decode_set() 1 aw_digitron_disp_decode_set(0, aw_digitron_seg8_ascii_decode); 'O' 0xFC 1 uint16_t my_decode(uint16_t ch) 2 { 3 // 4 if (ch =='O') { 5 return 0xFC; 6 } 120

134 7 } pfn_decode aw_digitron_disp_decode_set(0, my_decode); 2 aw_err_t aw_digitron_disp_blink_set (int id, int index, aw_bool_t blink); id index index MiniPort-View 0 1blink AW_TRUE aw_digitron_disp_blink_set() 1 aw_digitron_disp_blink_set(0, 1, AW_TRUE); 3 int aw_digitron_disp_at (int id, int index, uint16_t seg); id index seg 8 '-' g 0x aw_digitron_disp_at() 1 aw_digitron_disp_at(0, 1, 0x02); 4 aw_err_t aw_digitron_disp_char_at (int id, int index, const char ch); id index ch 'H' aw_digitron_disp_char_at() 1 aw_digitron_disp_char_at (0, 1, 'H'); 5 int aw_digitron_disp_str (int id, int index, int len, const char *p_str); id index len p_str len 121

135 HELLO aw_digitron_disp_str() 1 aw_digitron_disp_str(0, 0, 5,"HELLO"); MiniPort-ViewHE aw_digitron_disp_str() num aw_digitron_disp_str() 1 int num = 53; 2 char buf[3]; 3 aw_snprintf(buf, 3, "%2d", num); 4 aw_digitron_disp_str(0, 0, 2, buf); aw_snprintf() C snprintf() aw_vdebug.h int aw_snprintf (char *buf, size_t sz, const char *fmt,...); aw_kprintf()aw_kprintf() aw_snprintf() sz buf 6 int aw_digitron_disp_clr (int id); id aw_digitron_disp_clr() 1 aw_digitron_disp_clr(0); 7 aw_err_t aw_digitron_disp_enable (int id); id aw_digitron_disp_enable() 1 aw_digitron_disp_enable(0); 8 CPU CPU aw_err_t aw_digitron_disp_disable (int id); 122

136 id aw_digitron_disp_disable() 1 aw_digitron_disp_disable(0); aw_digitron_disp_enable() 60s 5s #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_digitron_disp.h" 5 6 #define DIGITRON_ID 0 // 7 8 static void digitron_show_num (int id, int num) 9 { 10 char buf[3]; 11 aw_snprintf(buf, 3, "%2d", num); 12 aw_digitron_disp_str(id, 0, 2, buf); 13 } int aw_main() 16 { 17 unsigned int num = 60; // 60s aw_digitron_disp_decode_set( DIGITRON_ID, aw_digitron_seg8_ascii_decode); 19 while(1) { 20 digitron_show_num( DIGITRON_ID, num); // count 21 if (num < 5) { // 5 22 aw_digitron_disp_blink_set( DIGITRON_ID, 1, AW_TRUE); 23 } else { 24 aw_digitron_disp_blink_set( DIGITRON_ID, 1, AW_FALSE); 25 } 26 if (num){ // count num--; 28 } else { // count num = 60; 30 } 31 aw_mdelay(1000); 32 } 33 } DIGITRON_ID 123

137 6.5 AWorks SHT11 AWorks LM75 SHT11 AWorks id id id ID 10 0 ~ 9 3x,y,z 10 ~ 12 3x,y,z 13 ~ ~ ~ 26 id SDK id SHT aw_sensor.h aw_err_t aw_sensor_type_get (int id); aw_err_t aw_sensor_enable (int id); aw_err_t aw_sensor_data_get (int id, aw_sensor_val_t *p_val); aw_err_t aw_sensor_disable (int id); 124

138 aw_err_t aw_sensor_group_enable (const int *p_ids, int num, aw_sensor_val_t *p_result); aw_err_t aw_sensor_group_data_get (const int *p_ids, int num, aw_sensor_val_t *p_buf); aw_err_t aw_sensor_group_disable (const int *p_ids, int num, aw_sensor_val_t *p_result); 1 VA AWorks aw_sensor.h AW_SENSOR_TYPE_VOLTAGE V AW_SENSOR_TYPE_CURRENT A AW_SENSOR_TYPE_TEMPERATURE AW_SENSOR_TYPE_PRESS AW_SENSOR_TYPE_LIGHT AW_SENSOR_TYPE_DISTANCE AW_SENSOR_TYPE_ACCELEROMETER m/s^2 AW_SENSOR_TYPE_GYROSCOPE rad/s AWorks aw_err_t aw_sensor_type_get (int id); id >=0 AW_SENSOR_TYPE_ -AW_ENODEV id aw_err_t ret = aw_sensor_type_get(0); 2 if (ret < 0) { 3 // 4 } else { 5 if (ret == AW_SENSOR_TYPE_TEMPERATURE) { 6 // 125

139 7 } else { 8 // 9 } 10 } 2 AWorks (1) (2) (3) AWorks AWorks aw_err_t aw_sensor_enable (int id); id AW_OK -AW_ENODEV id aw_err_t ret = aw_sensor_enable(0); 2 if (ret < 0) { 3 // 4 } else { 5 // 6 } aw_err_t aw_sensor_group_enable (const int int aw_sensor_val_t *p_ids, num, *p_result); p_ids id num id p_result num aw_sensor_val_t aw_sensor_val_t (aw_sensor.h) 1 typedef struct aw_sensor_val { 126

140 2 int32_t val; // 3 int32_t unit; // 4 } aw_sensor_val_t; val unit unit val val AW_OK -AW_ENODEV aw_sensor_group_enable() AW_OK p_result val AW_OK AW_OK p_result p_result const int id[6] = {0, 3, 5, 6, 8, 9}; // aw_sensor_val_t buf[6]; // aw_err_t ret = aw_sensor_group_enable(id, 6, buf); 5 6 if (ret < 0) { // 7 int i; 8 for (i = 0; i < 6; i++) { 9 if (buf[i].val < 0) { 10 // i 11 } else { 12 // i 13 } 14 } 15 } else { 16 // buf 17 } 3 AWorks aw_err_t aw_sensor_data_get (int id, aw_sensor_val_t *p_val); id p_val AW_OK aw_sensor_val_t typedef struct aw_sensor_val { 127

141 2 int32_t val; // 3 int32_t unit; // 4 } aw_sensor_val_t; val unit M10 6 k 10 3 m10-3 unit 10 m unit -3 unit unit AWorks SI mpn uint AW_SENSOR_UNIT_YOTTA Yotta Y 24 AW_SENSOR_UNIT_ZETTA Zetta Z 21 AW_SENSOR_UNIT_EXA Exa E 18 AW_SENSOR_UNIT_PETA Peta P 15 AW_SENSOR_UNIT_TERA Tera T 12 AW_SENSOR_UNIT_GIGA Giga G 9 AW_SENSOR_UNIT_MEGA Mega M 6 AW_SENSOR_UNIT_KILO kilo k 3 AW_SENSOR_UNIT_HECTO hecto h 2 AW_SENSOR_UNIT_DECA deca da 1 AW_SENSOR_UNIT_BASE AW_SENSOR_UNIT_DECI deci d -1 AW_SENSOR_UNIT_CENTI centi c -2 AW_SENSOR_UNIT_MILLI milli m -3 AW_SENSOR_UNIT_MICRO micro -6 AW_SENSOR_UNIT_NANO nano n -9 AW_SENSOR_UNIT_PICO pico p -12 AW_SENSOR_UNIT_FEMTO femto f -15 AW_SENSOR_UNIT_ATTO atto a -18 AW_SENSOR_UNIT_ZEPTO zepto z -21 AW_SENSOR_UNIT_YOCTO yocto y -24 unit m 10-3 M 10 6 meterkilometer val 6.7 V val 1234unit AW_SENSOR_UNIT_MILLI-3-3 mmv 1234mV 128

142 data AV AWorks 1.234V mv m mV aw_sensor_val_t val 1234unit m unit val ~ unit val unit AW_SENSOR_UNIT_KILO k aw_sensor_val_t temp_val; 2 aw_err_t ret; 3 4 aw_sensor_enable(0); // 5 ret = aw_sensor_data_get(0, &temp_val); // 6 if (ret < 0) { 7 // 8 } else { 9 // 10 float temp = temp_val.val * pow(10, temp_val.unit); 11 } pow() C math.h double pow(double x, double y); x y x y double unit -3val aw_kprintf("the temp 0 is : %d.%03d\r\n", temp_val.val / 1000, temp_val.val % 1000); val unit

143 aw_kprintf("the temp 0 is : %d.%06d\r\n", temp_val.val / , temp_val.val % ); unit unit -6 unit -3 3 temp_val.unit += 3; temp_val.val /= 1000; aw_kprintf("the temp 0 is : %d.%03d\r\n", temp_val.val / 1000, temp_val.val % 1000); unit val 1000 temp_val unit -3 3 val val unit val unit unit -3AWorks unit unit n val 10 n val 1860mV V 2V 1245mV V 1V unit unit n val 10n val ~ val 10n aw_err_t aw_sensor_val_unit_convert (aw_sensor_val_t *p_buf, int num, int32_t to_unit); p_buf num to_unit AW_SENSOR_UNIT_* AW_SENSOR_UNIT_MILLI AW_OK val 10 n 32 val unit aw_sensor_val_t temp_val; 2 aw_err_t ret; 3 aw_sensor_enable(0); // 130

144 4 ret = aw_sensor_data_get(0, &temp_val); // 5 if (ret < 0) { 6 // 7 } else { 8 // AW_SENSOR_UNIT_MILLI-3 9 aw_sensor_val_unit_convert(&temp_val, 1, AW_SENSOR_UNIT_MILLI); 10 aw_kprintf("the temp 0 is : %d.%03d\r\n", temp_val.val / 1000, temp_val.val % 1000); 11 } 0 val ~ unit ~ aw_err_t aw_sensor_group_data_get (const int int aw_sensor_val_t *p_ids, num, *p_buf); p_ids id num id p_buf num AW_OKp_buf p_buf AW_SENSOR_VAL_IS_VALID() FALSE AW_SENSOR_VAL_IS_VALID() val val -AW_ENODEV AW_SENSOR_VAL_IS_VALID() aw_sensor.h AW_SENSOR_VAL_IS_VALID(data) data aw_sensor_val_t TRUE data data unit val const int id[6] = {0, 3, 5, 6, 8, 9}; // aw_sensor_val_t buf[6]; // 6 3 aw_err_t ret; 4 5 // 6 aw_sensor_group_enable(id, 6, buf); 131

145 7 8 ret = aw_sensor_group_data_get(id, 6, buf); 9 10 if (ret < 0) { // 11 int i; 12 for (i = 0; i < 6; i++) { 13 if (AW_SENSOR_VAL_IS_VALID(buf[i])) { 14 // 15 } else { 16 // buf[i].val 17 } 18 } 19 } else { 20 // AW_SENSOR_VAL_IS_VALID() buf 21 } const int id[6] = {0, 3, 5, 6, 8, 9}; // aw_sensor_val_t buf[6]; // 6 3 int i; 4 5 aw_sensor_group_enable(id, 6, buf); // 6 aw_sensor_group_data_get(id, 6, buf); // 7 8 for (i = 0; i < 6; i++) { 9 if (AW_SENSOR_VAL_IS_VALID(buf[i])) { 10 // 11 } else { 12 // buf[i].val 13 } 14 } 4 AWorks aw_err_t aw_sensor_disable (int id); id AW_OK -AW_ENODEV id

146 aw_err_t ret = aw_sensor_disable(0); 2 if (ret < 0) { 3 // 4 } else { 5 // 6 } aw_err_t aw_sensor_group_disable (const int int aw_sensor_val_t *p_ids, num, *p_result); p_ids id num id p_result num unit val val AW_OK -AW_ENODEV aw_sensor_group_disable() AW_OK p_result val AW_OK AW_OK p_result p_result const int id[6] = {0, 3, 5, 6, 8, 9}; // aw_sensor_val_t buf[6]; // aw_err_t ret = aw_sensor_group_disable(id, 6, buf); 5 6 if (ret < 0) { // 7 int i; 8 for (i = 0; i < 6; i++) { 9 if (buf[i].val < 0) { 10 // i 11 } else { 12 // i 13 } 14 } 15 } else { 16 // buf 17 } 133

147 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_digitron_disp.h" 5 #include "aw_sensor.h" 6 #include "string.h" 7 8 #define APP_SENSOR_TEMP_ID 0 // ID 9 #define APP_DIGITRON_DISP_ID 0 // ID static void digitron_disp_num (int num) // 12 { 13 char buf[3]; 14 aw_snprintf(buf, 3, "%2d", num); 15 aw_digitron_disp_str( APP_DIGITRON_DISP_ID, 0, strlen(buf), buf); 16 } int aw_main() 19 { 20 aw_sensor_val_t temp_val; 21 aw_sensor_enable( APP_SENSOR_TEMP_ID); // 22 while(1) { 23 if (aw_sensor_data_get( APP_SENSOR_TEMP_ID, &temp_val) < 0) { // 24 // "ER" 25 aw_digitron_disp_str( APP_DIGITRON_DISP_ID, 0, 2, "ER"); 26 } else { 27 // AW_SENSOR_UNIT_BASE 28 aw_sensor_val_unit_convert(&temp_val, 1, AW_SENSOR_UNIT_BASE); 29 digitron_disp_num(temp_val.val); 30 } 31 aw_mdelay(1000); 32 } 33 } id id ~ 8 id 0 id 6.6 LED 1 134

148 I 2 C LM75B 2 LED0 LED1 LED LED0 LED1 3 4 SET / (1) SET LED0 1 1 / (2) SET LED1 1 1 / KEY0KEY2 KEY1 KEY3 3 key_callback() while(1) 3 500ms LED0 LED #include "aworks.h" 2 #include "aw_vdebug.h" 3 #include "aw_delay.h" 4 #include "aw_buzzer.h" 5 #include "aw_led.h" 6 #include "aw_input.h" 7 #include "aw_digitron_disp.h" 135

149 8 #include "aw_sensor.h" 9 #include "string.h" #define APP_SENSOR_TEMP_ID 0 // ID 12 #define APP_DIGITRON_DISP_ID 0 // ID /* g_adj_state */ 15 #define STATE_NORMAL 0 16 #define STATE_ADJ_HIGH 1 17 #define STATE_ADJ_LOW /* key_val_process() */ 20 #define VAL_ADJ_TYPE_ADD 1 21 #define VAL_ADJ_TYPE_SUB static uint8_t g_temp_high = 30; // static uint8_t g_temp_low = 28; // static uint8_t g_adj_state = 0; // 0-1-, 2-26 static uint8_t g_adj_pos = 0; // static void digitron_disp_num (int num) // 29 { 30 char buf[3]; 31 aw_snprintf(buf, 3, "%2d", num); 32 aw_digitron_disp_str( APP_DIGITRON_DISP_ID, 0, strlen(buf), buf); 33 } static void key_state_process (void) // KEY0 36 { 37 g_adj_state = (g_adj_state + 1) % 3; // 0 ~ 2 38 if (g_adj_state == STATE_ADJ_HIGH) { // 39 aw_led_on(0); 40 aw_led_off(1); 41 g_adj_pos = 1; // 1 42 aw_digitron_disp_blink_set(0,g_adj_pos, AW_TRUE); // 43 digitron_disp_num(g_temp_high); // 44 } else if (g_adj_state == STATE_ADJ_LOW) { // 45 aw_led_on(1); 46 aw_led_off(0); 47 aw_digitron_disp_blink_set(0, g_adj_pos, AW_FALSE); // 48 g_adj_pos = 1; // 49 aw_digitron_disp_blink_set(0, g_adj_pos, AW_TRUE); 50 digitron_disp_num(g_temp_low); // 51 } else { // 136

150 52 aw_led_off(0); 53 aw_led_off(1); 54 aw_digitron_disp_blink_set(0, g_adj_pos, AW_FALSE); // 55 g_adj_pos = 1; // 56 } 57 } static void key_val_process(uint8_t type) // { 61 uint8_t num_single = 0; // 62 uint8_t num_ten = 0; // 63 uint8_t num_temp; // 64 if (g_adj_state == STATE_ADJ_HIGH) { 65 num_single = g_temp_high % 10; // 66 num_ten = g_temp_high / 10; 67 } else if (g_adj_state == STATE_ADJ_LOW){ 68 num_single = g_temp_low % 10; // 69 num_ten = g_temp_low / 10; 70 } else { // 71 return; 72 } 73 if (type == VAL_ADJ_TYPE_ADD) { // 1 74 if (g_adj_pos == 1) { 75 num_single = (num_single + 1) % 10; // 10 ~ 9 76 } else { 77 num_ten = (num_ten + 1) % 10; // 10 ~ 9 78 } 79 } else { // 1 80 if (g_adj_pos == 1) { 81 num_single = (num_single ) % 10; // 10 ~ 9 82 } else { 83 num_ten = (num_ten ) % 10; // 10 ~ 9 84 } 85 } 86 num_temp = num_ten * 10 + num_single; // 87 /* */ 88 if ((g_adj_state == STATE_ADJ_HIGH) && (num_temp >= g_temp_low)) { 89 g_temp_high = num_temp; // 90 digitron_disp_num(g_temp_high); // 91 } else if ((g_adj_state == STATE_ADJ_LOW) && (num_temp <= g_temp_high)) { 92 g_temp_low = num_temp; // 93 digitron_disp_num(g_temp_low); // 94 } 95 } 137

151 96 97 static void key_pos_process(void) // 98 { 99 if (g_adj_state!= STATE_NORMAL) { // 100 aw_digitron_disp_blink_set(0, g_adj_pos, AW_FALSE); 101 g_adj_pos =!g_adj_pos; // 102 aw_digitron_disp_blink_set(0, g_adj_pos, AW_TRUE); 103 } 104 } static void key_callback (aw_input_event_t *p_input_data, void *p_usr_data) 107 { 108 if (p_input_data->ev_type == AW_INPUT_EV_KEY) { // 109 // 110 aw_input_key_data_t *p_data = (aw_input_key_data_t *)p_input_data; 111 if (p_data->key_state!= 0) { // switch (p_data->key_code) { 113 case KEY_0: key_state_process();break; // 114 case KEY_1: key_val_process( VAL_ADJ_TYPE_ADD); break; // case KEY_2: key_pos_process();break; // 116 case KEY_3: key_val_process( VAL_ADJ_TYPE_SUB); break; // default:break; 118 } 119 } 120 } 121 } int aw_main (void) 124 { 125 static aw_input_handler_t key_handler; 126 aw_sensor_val_t temp_val; aw_sensor_enable( APP_SENSOR_TEMP_ID); // 129 aw_digitron_disp_decode_set( APP_DIGITRON_DISP_ID, aw_digitron_seg8_ascii_decode); 130 aw_input_handler_register(&key_handler, key_callback, NULL); // while(1) { 133 if (g_adj_state == STATE_NORMAL) { // 134 if (aw_sensor_data_get( APP_SENSOR_TEMP_ID, &temp_val) < 0) { // 135 aw_digitron_disp_str( APP_DIGITRON_DISP_ID, 0, 2, "ER"); // "ER" 136 } else { 137 // AW_SENSOR_UNIT_BASE 138 aw_sensor_val_unit_convert(&temp_val, 1, AW_SENSOR_UNIT_BASE); 139 digitron_disp_num(temp_val.val); // 138

152 140 if (temp_val.val > g_temp_high temp_val.val < g_temp_low ) { 141 aw_buzzer_on(); // 142 } else { 143 aw_buzzer_off(); 144 } 145 } 146 aw_led_toggle(0); // LED0 LED1 147 aw_led_toggle(1); 148 aw_mdelay(500); 149 } 150 } 151 } 139

153 7 MCU GPIOPWMI 2 CSPI UARTADC MCU AWorks MCU MCU 7.1 GPIO I/O I/O I/O I/O GPIOGeneral Purpose Input OutputGPIO // I/O i.mx280 PIO3_0 4 0 I 2 C0 CTS GPIO GPIO IO AWorks I/O aw_err_t aw_gpio_pin_cfg(int pin, uint32_t flags); pin flags AW_OK pin GPIO pin{chip}_pin.h chip i.mx28x MCUchip imx28x imx28x_pin.h PIOx_yPIO3_0 flags C 1 AWorks GPIO aw_gpio.h 140

154 AW_GPIO_* AW_GPIO_INPUT AW_GPIO_OUTPUT AW_GPIO_OUTPUT_INIT_HIGH AW_GPIO_OUTPUT_INIT_LOW 7.2 AW_GPIO_PULL_UP AW_GPIO_PULL_DOWN AW_GPIO_FLOAT AW_GPIO_OPEN_DRAIN AW_GPIO_PUSH_PULL aw_gpio_pin_cfg(pio2_6, AW_GPIO_OUTPUT); // 2 aw_gpio_pin_cfg(pio2_6, AW_GPIO_OUTPUT_INIT_HIGH); // 3 aw_gpio_pin_cfg(pio2_6, AW_GPIO_OUTPUT_INIT_LOW); // 4 5 aw_gpio_pin_cfg(pio2_6, AW_GPIO_OUTPUT AW_GPIO_PUSH_PULL); // 6 aw_gpio_pin_cfg(pio2_6, AW_GPIO_OUTPUT AW_GPIO_OPEN_DRAIN); // 7 aw_gpio_pin_cfg(pio2_6, AW_GPIO_INPUT AW_GPIO_PULL_UP); // 8 aw_gpio_pin_cfg(pio2_6, AW_GPIO_INPUT AW_GPIO_FLOAT); // 2 {chip}_pin.h PIOx_y_*PIO3_0_AUART0_RX PIO3_0 0 PIO3_0{chip}_pin.h PIO PIO3_0 PIO3_0_AUART0_RX PIO3_0 PIO PIO3_ PIO PIO3_0 PIO3_0 141

155 7.3 PIO3_0 7.4 PIO3_0_AUART0_RX PIO3_0_I2C0_SCL PIO3_0_DUART_CTS PIO3_0_GPIO 0 I 2 C0 CTS GPIO PIO_MODE_1V8 1.8V PIO_MODE_3V3 3.3V PIO_MODE_4MA 4mA PIO_MODE_8MA 8mA PIO_MODE_12MA 12mA aw_gpio_pin_cfg(pio3_24, PIO3_24_I2C0_SCL PIO_MODE_3V3); // PIO3_24 I 2 C0 SCL 2 aw_gpio_pin_cfg(pio3_25, PIO3_25_I2C0_SDA PIO_MODE_3V3); // PIO3_25 I 2 C0 SDA 3 4 aw_gpio_pin_cfg(pio2_10, PIO2_10_SSP0_SCK PIO_MODE_3V3); // PIO2_10 SSP0 SCK 5 aw_gpio_pin_cfg(pio2_8, PIO2_8_SSP0_CMD PIO_MODE_3V3); // PIO2_8 SSP0 MOSI 6 aw_gpio_pin_cfg(pio2_0, PIO2_0_SSP0_D0 PIO_MODE_3V3); // PIO2_0 SSP0 D0 7 8 aw_gpio_pin_cfg(pio3_2, PIO3_2_DUART_RX PIO_MODE_3V3); // PIO3_2 RX 9 aw_gpio_pin_cfg(pio3_3, PIO3_3_DUART_TX PIO_MODE_3V3); // PIO3_3 TX I 2 C aw_gpio_pin_cfg(pio3_24, PIO3_24_I2C0_SCL PIO_MODE_3V3 AW_GPIO_PULL_UP); 2 aw_gpio_pin_cfg(pio3_25, PIO3_25_I2C0_SDA PIO_MODE_3V3 AW_GPIO_PULL_UP); I/O 7.3 PIO3_0 4 PIO3_0 PIO3_0 I 2 C0 0 PIO3_0 0 I 2 C0 AWorks 142

156 aw_gpio.h aw_err_t aw_gpio_pin_request(const char *p_name, const int *p_pins, int num); aw_err_t aw_gpio_pin_release(const int *p_pins, int num); 1 aw_err_t aw_gpio_pin_request(const char *p_name, const int *p_pins, int num); p_name p_pins num AW_OK p_name LEDUART SSP0 I2C0 p_pins PIO3_2 PIO3_3 static const int uart0_pins_table[] = { PIO3_2, PIO3_3 }; num p_pins PIO3_2 PIO3_ if (aw_gpio_pin_request("uart", uart0_pins_table, 2) == AW_OK) { 2 // PIO3_2 PIO3_3 3 aw_gpio_pin_cfg(pio3_2, PIO3_2_DUART_RX PIO_MODE_3V3); 4 aw_gpio_pin_cfg(pio3_3, PIO3_3_DUART_TX PIO_MODE_3V3); 5 } IO GPIO PIO2_6 I/O LED0 I/O const int pin_led0 = PIO2_6; 2 if (aw_gpio_pin_request("pin_led0", &pin_led0, 1) == AW_OK) { 143

157 3 aw_gpio_pin_cfg(pin_led0, AW_GPIO_OUTPUT); // PIO2_6 4 } aw_gpio_pin_cfg() 2 aw_err_t aw_gpio_pin_release(const int *p_pins, int num); p_pins num AW_OK p_pins PIO3_2 PIO3_3 static const int uart0_pins_table[] = { PIO3_2, PIO3_3 }; num p_pins PIO3_2 PIO3_ aw_gpio_pin_cfg(pio3_2, AW_GPIO_INPUT AW_GPIO_FLOAT); // 2 aw_gpio_pin_cfg(pio3_3, AW_GPIO_INPUT AW_GPIO_FLOAT); // 3 aw_gpio_pin_release(uart0_pins_table, 2); // I/O GPIO I/O I/O I/O GPIO aw_gpio.h aw_err_t aw_gpio_get(int pin); aw_err_t aw_gpio_set(int pin, int value); aw_err_t aw_gpio_toggle(int pin); GPIO / GPIO GPIO 1 aw_err_t aw_gpio_get(int pin); pin 0 144

158 if (aw_gpio_get(pio0_5) == 0) { 2 // PIO0_5 3 } 2 aw_err_t aw_gpio_set(int pin, int value); pin value value 0 AW_OK GPIO LED EPC-AW280 RUN 7.1 MCU PIO2_6 I/O LED 3.3V LED LED LED I/O 1 LED LED PIO2_6 LED #include "aworks.h" 2 #include "aw_gpio.h" 3 #include "aw_delay.h" 4 5 int aw_main (void) 6 { 7 const int pin_led0 = PIO2_6; 8 if (aw_gpio_pin_request("pin_led0", &pin_led0, 1) == AW_OK) { // 9 aw_gpio_pin_cfg(pin_led0, AW_GPIO_OUTPUT_INIT_HIGH); // 10 aw_gpio_set(pin_led0, 0); // LED 11 } 12 while(1) { 13 aw_mdelay(1000); 14 } 15 } PIO2_6 LED LED PIO2_6 LED PIO2_6 LED

159 7.9 1 #include "aworks.h" 2 #include "aw_gpio.h" 3 #include "aw_delay.h" 4 5 int aw_main (void) 6 { 7 const int pin_led0 = PIO2_6; 8 if (aw_gpio_pin_request("pin_led0", &pin_led0, 1) == AW_OK) { // 9 aw_gpio_pin_cfg(pin_led0, AW_GPIO_OUTPUT_INIT_HIGH); // 10 while(1) { 11 aw_gpio_set(pin_led0, 0); // LED 12 aw_mdelay(200); 13 aw_gpio_set(pin_led0, 1); // LED 14 aw_mdelay(200); 15 } 16 } 17 while(1) { // 18 aw_mdelay(1000); 19 } 20 } GPIO LED GPIO AWorks LED LED LED 3 GPIO GPIO GPIO aw_err_t aw_gpio_toggle(int pin); pin AW_OK 7.9 LED GPIO GPIO LED #include "aworks.h" 2 #include "aw_gpio.h" 3 #include "aw_delay.h" 4 5 int aw_main (void) 6 { 7 const int pin_led0 = PIO2_6; 8 if (aw_gpio_pin_request("pin_led0", &pin_led0, 1) == AW_OK) { // 9 aw_gpio_pin_cfg(pin_led0, AW_GPIO_OUTPUT_INIT_HIGH); // 10 while(1) { 146

160 11 aw_gpio_toggle(pin_led0); // 12 aw_mdelay(200); 13 } 14 } 15 while(1) { // 16 aw_mdelay(1000); 17 } 18 } I/O I/O aw_gpio_get() GPIO GPIO I/O aw_gpio_get() 0 CPU AWorks I/O GPIO AWorks I/O GPIO GPIO aw_err_t aw_gpio_trigger_connect( int pin, aw_pfuncvoid_t pfunc_callback, void *p_arg); aw_err_t aw_gpio_trigger_disconnect( int pin, aw_pfuncvoid_t pfunc_callback, void *p_arg); aw_err_t aw_gpio_trigger_cfg(int pin, uint32_t flags); aw_err_t aw_gpio_trigger_on(int pin); aw_err_t aw_gpio_trigger_off(int pin); 1 aw_err_t aw_gpio_trigger_connect (int pin, aw_pfuncvoid_t pfunc_callback, void *p_arg); pin pfunc_callback p_arg 147

161 AW_OK pfunc_callback aw_pfuncvoid_t aw_types.h typedef void (*aw_pfuncvoid_t) (void *); void * pfunc_callback p_arg PIO3_ // 2 static void gpio_trigger_callback (void *p_arg) 3 { 4 // 5 } 6 7 aw_gpio_trigger_connect(pio3_6, gpio_trigger_callback, NULL); // 2 aw_gpio_trigger_connect() aw_err_t aw_gpio_trigger_disconnect(int aw_pfuncvoid_t void pin, pfunc_callback, *p_arg); pin pfunc_callback p_arg p_arg AW_OK // 2 static void gpio_trigger_callback (void *p_arg) 3 { 4 // 5 } 6 aw_gpio_trigger_connect(pio3_6, gpio_trigger_callback, NULL); // 7 //... 8 aw_gpio_trigger_disconnect(pio3_6, gpio_trigger_callback, NULL); // 3 aw_err_t aw_gpio_trigger_cfg(int pin, uint32_t flags); pin flags AW_OK 148

162 GPIO AW_GPIO_TRIGGER_HIGH AW_GPIO_TRIGGER_LOW AW_GPIO_TRIGGER_RISE AW_GPIO_TRIGGER_FALL AW_GPIO_TRIGGER_BOTH_EDGES PIO3_ // PIO3_6 2 if (aw_gpio_trigger_cfg(pio3_6, AW_GPIO_TRIGGER_FALL)!= AW_OK) { 3 // 4 } 4 aw_err_t aw_gpio_trigger_on(int pin); pin AW_OK #include "aworks.h" 2 #include "aw_gpio.h" 3 #include "aw_delay.h" 4 #include "aw_led.h" 5 6 static void gpio_trigger_callback (void *p_arg) 7 { 8 aw_led_toggle(0); // LED 9 } int aw_main (void) 12 { 149

163 13 const int pin_test = PIO3_6; 14 if (aw_gpio_pin_request("pin_test", &pin_test, 1) == AW_OK) { // 15 aw_gpio_pin_cfg(pin_test, AW_GPIO_INPUT AW_GPIO_PULL_UP); // 16 aw_gpio_trigger_connect(pin_test, gpio_trigger_callback, NULL); // 17 aw_gpio_trigger_cfg(pin_test, AW_GPIO_TRIGGER_FALL); // 18 aw_gpio_trigger_on(pin_test); // 19 } 20 while(1) { 21 aw_mdelay(1000); 22 } 23 } aw_gpio_pin_cfg() aw_gpio_trigger_cfg() PIO3_6 PIO3_6 GND LED GND LED PIO3_6 5 aw_err_t aw_gpio_trigger_off(int pin); pin AW_OK // 2 static void gpio_trigger_callback (void *p_arg) 3 { 4 // I/O 5 } 6 int aw_main (void) 7 { 8 const int pin_test = PIO3_6; 9 if (aw_gpio_pin_request("pin_test", &pin_test, 1) == AW_OK) { // 10 aw_gpio_pin_cfg(pin_test, AW_GPIO_INPUT AW_GPIO_PULL_UP); // 11 aw_gpio_trigger_connect(pin_test, gpio_trigger_callback, NULL); // 12 aw_gpio_trigger_cfg(pin_test, AW_GPIO_TRIGGER_FALL); // 13 aw_gpio_trigger_on(pin_test); // 14 //

164 15 aw_gpio_trigger_off(pin_test); // 16 } 17 // } aw_gpio_trigger_on() 7.2 PWM PWM PWMPulse Width Modulation / 0~100%PWM LED PWM 0 I/O PWM PWM PWM 0I/O I/O PWM AWorks PWM PWM aw_pwm.h aw_err_t aw_pwm_config ( int pid, unsigned long duty_ns, unsigned long period_ns); aw_err_t aw_pwm_enable(int pid); aw_err_t aw_pwm_disable(int pid); PWM PWM PWM 151

165 1 PWM PWM aw_err_t aw_pwm_config ( int unsigned long unsigned long pid, duty_ns, period_ns); pid PWM id duty_ns nsperiod_ns AW_OK AWorks PWM pid PWM i.mx28x 8 PWM PWM 0 ~ 7 I/O I/O I/O I/O 0 GPIO3_16 4 GPIO3_29 1 GPIO3_17 5 GPIO3_22 2 GPIO3_18 6 GPIO3_23 3 GPIO3_28 7 GPIO3_26 PWM I/O SDK.pdf PWM period_ns 1KHz PWM 1ms period_ns PWM duty_ns PWM duty_ns / period_nsduty_ns period_ns PWM 0 PWM 1KHz 50% PWM 1 // PWM ns1ms ns0.5ms 2 aw_pwm_config (0, , ); 2 PWM PWM PWM PWM aw_err_t aw_pwm_enable(int pid); pid PWM id AW_OK PWM PWM PWM PWM 1 // PWM ns1ms ns0.5ms 2 aw_pwm_config (0, , ); 3 aw_pwm_enable(0); // PWM 0 152

166 3 PWM PWM PWM aw_err_t aw_pwm_disable(int pid); pid PWM id AW_OK PWM PWM PWM 1 // PWM ns1ms ns0.5ms 2 aw_pwm_config (0, , ); 3 aw_pwm_enable(0); // PWM 0 4 //... 5 aw_pwm_disable(0); // PWM 0 EPC-AW GPIO3_29 GPIO3_29 GPIO3_29 GPIO3_29 PWM GPIO3_29 PWM id 4 PWM 4 PWM PWM 1 #include "aworks.h" 2 #include "aw_pwm.h" 3 #include "aw_delay.h" 4 5 int aw_main() 6 { 7 aw_pwm_config(4, , ); // 1KHz 50% 8 aw_pwm_enable(4); // 4 9 while(1) { 10 aw_mdelay(1000); 11 } 12 } PWM PWM PWM 153

167 PWM PWM 1 #include "aworks.h" 2 #include "aw_pwm.h" 3 #include "aw_delay.h" 4 5 int aw_main() 6 { 7 aw_pwm_config(4, , ); // 1KHz 50% 8 while(1) { 9 aw_pwm_enable(4); // 4 10 aw_mdelay(100); // 100ms 100ms 11 aw_pwm_disable(4); // PWM 12 aw_mdelay(1000); // 1s 1 13 } 14 } PWM PWM AWorks 7.3 SPI SPI SPISerial Peripheral Interface M MSPI // 4 SCLKMOSIMISO CS 7.4 SCLK MOSI MISO CS 7.4 SPI CS SCLK MOSI MISO CS SCLK MOSIMISO CS

168 7.5 SPI SPI SPI SPI SPI SPI SPI CPOL 7.11 SPI SPI CPOL=1CPOL=0 CPOL CPHA CPHA CPHA=0 CPHA= CPHA=0 SPI 0CPOL=0 2CPOL= SPI 0 2 SPI 0CPOL=0CPHA=0 SPI 2CPOL=1CPHA=0 CPHA=1 SPI 1CPOL=0 3CPOL=

169 7.7 SPI 1 3 SPI 1CPOL=0CPHA=1 SPI 3CPOL=1CPHA= SPI MCU SPI SPI AWorks MCU SPI SPI void aw_spi_mkdev ( aw_spi_device_t *p_dev, uint8_t busid, uint8_t bits_per_word, uint16_t mode, SPI uint32_t max_speed_hz, int cs_pin, void (*pfunc_cs)(aw_spi_device_t *p_dev, int state)) ; aw_err_t aw_spi_setup(aw_spi_device_t *p_dev); SPI aw_err_t aw_spi_write_then_read( aw_spi_device_t *p_dev, const uint8_t *p_txbuf, size_t n_tx, SPI uint8_t *p_rxbuf, size_t n_rx); aw_err_t aw_spi_write_then_write( aw_spi_device_t *p_dev, const uint8_t *p_txbuf0, size_t n_tx0, SPI const uint8_t *p_txbuf1, size_t n_tx1); 156

170 1 SPI SPI SPI HC595 SPI FLASH MCU SPI SPI SPI AWorks SPI aw_spi_device_t SPI aw_spi_device_t spi_dev; // SPI spi_dev p_dev 2 SPI SPI void aw_spi_mkdev ( aw_spi_device_t *p_dev, uint8_t busid, uint8_t bits_per_word, uint16_t mode, uint32_t max_speed_hz, int cs_pin, void (*pfunc_cs)(aw_spi_device_t *p_dev, int state)) ; p_dev SPI busid SPI bits_per_word mode SPI max_speed_hz cs_pin pfunc_cs AWorks SPI busid SPI i.mx28x 5 SPI 0 ~ 4busid SPI bits_per_word 8 mode SPI 0 ~ SPI 7.13 SPI AW_SPI_MODE_0 SPI 0 CPOL=0CPHA=0 mode SPI AW_SPI_MODE_1 SPI 1 CPOL=0CPHA=1 AW_SPI_MODE_2 SPI 2 CPOL=1CPHA=0 max_speed_hz SCLK AW_SPI_MODE_3 SPI 3 CPOL=1CPHA=1 MCU SPI MCU SPI cs_pin pfunc_cs pfunc_cs pfunc_cs NULL cs_pin pfunc_cs NULL cs_pin 157

171 pfunc_cs SPI pfunc_cs state 1SPI pfunc_cs state 0 pfunc_cs NULLcs_pin PIO2_19 SPI0SPI busid 0 74HC595 74HC595 74HC595 / HC Q0 ~ Q7 Q7 Q7 8 Q0 ~ Q7 Q0 ~ Q HC595 CP D Q7 Q0 ~ Q7 Q7 8 74HC595 Q7 74HC595 D Q7 74HC595 Q7 74HC STR STR Q0 ~ Q7 Q0 ~Q7 8 Q0 ~ Q7 CP D STR Q0 ~ Q7 Q7 OE MR OE OE Q0 ~ Q7 OE Q0 ~ Q7 OE Q7 MR MR 0x00Q7 0 MR Q0 ~ Q7 MR STR 0x00 74HC595 D CP 8 CP 8 STR SPI 74HC595 STR SPI STR 158

172 STR 74HC595 SPI SPI SCLK CP MOSI D CS STR 74HC595 / SPI 74HC595 74HC595 SPI MISO MiniPort HC595 8 I/O LED OE MR HC595 MiniPort-595 i.mx28x MOSISCLK i.mx28x SPI0 CS PIO2_19 74HC595 SPI SPI 74HC SPI 8 SPI CP 74HC595 SPI HC MHz MCU MCU Hz3MHz 3MHz 74HC595 SPI aw_spi_device_t hc595_dev; // HC595 2 // 74HC595 SPI 3 aw_spi_mkdev(&hc595_dev, 4 0, // SPI 0 5 8, // 8-bit 6 AW_SPI_MODE_3, // , // 3MHz 8 PIO2_19, // PIO2_19 9 NULL); // NULL 159

173 3 SPI SPI MCU SPI aw_err_t aw_spi_setup(aw_spi_device_t *p_dev); p_dev SPI AW_OK 74HC595 74HC SPI 1 aw_err_t ret; 2 aw_spi_device_t hc595_dev; // HC // 74HC595 SPI 5 aw_spi_mkdev(&hc595_dev, 0, 8, AW_SPI_MODE_3, , PIO2_19, NULL); 6 7 ret = aw_spi_setup(&hc595_dev); // SPI 8 if (ret < 0) { 9 // 10 } else { 11 // 12 } 4 SPI SPI AWorks aw_err_t aw_spi_write_then_read( aw_spi_device_t *p_dev, const uint8_t size_t uint8_t size_t *p_txbuf, n_tx, *p_rxbuf, n_rx); p_dev p_txbuf n_tx p_rxbuf n_rx AW_OK 160

174 p_rxbuf NULLn_rx 0 p_txbuf NULLn_tx 0 8 0x55 74HC #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_spi.h" 5 6 int aw_main() 7 { 8 uint8_t tx_buf[1] = {0x55}; // 8 0x55 9 aw_spi_device_t hc595_dev; // HC // 74HC595 SPI 12 aw_spi_mkdev(&hc595_dev, 0, 8, AW_SPI_MODE_3, , PIO2_19, NULL); aw_spi_setup(&hc595_dev); // SPI aw_spi_write_then_read(&hc595_dev, 17 tx_buf, // 18 1, // 1 19 NULL, // 20 0); // 0 21 while (1) { 22 aw_mdelay(1000); 23 } 24 } MiniPort-LED MiniPort HC595 LED 0x LED1 LED3LED5 LED7 LED 7.10 MiniPort MiniPort-LED 74HC595 SPI + SPI FLASH MX25L MX25L ID RDID ID 0x9f ID

175 uint8_t cmd = 0x9f; // RDID 2 uint8_t id[3]; // 3 ID 3 4 aw_spi_write_then_read(&spi _dev, 5 &cmd, // 6 1, 7 id, // 3 ID 8 3); RDID SPI 5 aw_err_t aw_spi_write_then_write( aw_spi_device_t *p_dev, const uint8_t size_t const uint8_t size_t *p_txbuf0, n_tx0, *p_txbuf1, n_tx1); p_dev p_txbuf0 n_tx0 p_txbuf0 p_txbuf1 n_tx1 AW_OK p_txbuf1 NULLn_tx1 0 74HC595 MiniPort-595 MiniPort-LED LED0 ~ LED #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_spi.h" 5 6 int aw_main() 7 { 8 aw_spi_device_t hc595_dev; // HC595 9 uint8_t data = 0x01; // bit0 1 LED // 74HC595 SPI 12 aw_spi_mkdev(&hc595_dev, 0, 8, AW_SPI_MODE_3, , PIO2_19, NULL);

176 14 aw_spi_setup(&hc595_dev); // SPI 15 while (1) { 16 uint8_t temp = ~data; // data 0 LED 17 aw_spi_write_then_read(&hc595_dev, 18 &temp, // , // 1 20 NULL, // ); // 0 22 aw_mdelay(100); // LED 100ms 23 data <<= 1; // LED 24 if (data == 0) { // 8 0x01 25 data = 0x01; 26 } 27 } 28 } LED 74HC595 data LED 0 74HC595 NULL MX25L1606 SPI FLASH 0x int mx25xx_data_write (aw_spi_device_t *p_dev, 2 uint32_t addr, 3 uint8_t *p_buf, 4 uint32_t len) 5 { 6 uint8_t cmd_buf[4]; 7 8 cmd_buf[0] = 0x02; // 9 cmd_buf[1] = (addr >> 16) & 0xFF; // cmd_buf[2] = (addr >> 8 ) & 0xFF; 11 cmd_buf[3] = addr & 0xFF; return aw_spi_write_then_write(p_dev, 14 cmd_buf, 15 4, 16 p_buf, 17 len); 18 } 163

177 7.4 I 2 C I 2 C I 2 C Inter Integrated Circuit NXP I 2 C I 2 C 2 I 2 C I/O I 2 C I 2 C I/O 3V/5V 100Kbps 100K 400Kbps 3.4Mbps I 2 C MCU I 2 C I 2 C AWorks MCU I 2 C I 2 C void aw_i2c_mkdev ( aw_i2c_device_t *p_dev, uint8_t busid, uint16_t addr, uint16_t flags); aw_err_t aw_i2c_read( aw_i2c_device_t *p_dev, uint32_t subaddr, uint8_t *p_buf, size_t nbytes); aw_err_t aw_i2c_write( aw_i2c_device_t *p_dev, uint32_t subaddr, const void *p_buf, size_t nbytes); I 2 C I 2 C I 2 C 1 I 2 C I 2 C LM75 E 2 PROM MCU I 2 C 164

178 I 2 C AWorks aw_i2c_device_t I 2 C aw_i2c_device_t dev; // I 2 C dev p_dev 2 void aw_i2c_mkdev ( aw_i2c_device_t *p_dev, uint8_t uint16_t uint16_t busid, addr, flags); p_dev I 2 C busid I 2 C addr flags AWorks I 2 C busid I 2 C i.mx28x 2 I 2 C 0 ~ 1busid I 2 C addr I 2 C / 7 10 flags I 2 C AW_I2C_ADDR_7BIT 7Bit() AW_I2C_ADDR_10BIT 10Bit AW_I2C_IGNORE_NAK AW_I2C_SUBADDR_MSB_FIRST () AW_I2C_SUBADDR_LSB_FIRST AW_I2C_SUBADDR_NONE AW_I2C_SUBADDR_1BYTE 1 AW_I2C_SUBADDR_2BYTE 2 I 2 C0I 2 C busid 0 LM75B LM75B LM75B 7.11LM75B A 2A 1A 0A 2A 1A0 A 2 A 1A0 LM75B

179 SDA 1 8 Vcc SCL 2 LM75A 7 A0 OS 3 6 A1 GND 4 5 A LM75B 7.12 LM75B R9 R10 I 2 C J13_1J13_2J11_1J11_2 LM75 SCL SDA I 2 C0 SCL SDA LM75B A 2A 1 A 0 LM75B x48 LM75B 7 AW_I2C_ADDR_7BIT AW_I2C_IGNORE_NAK I 2 C LM75B LM75B / 0x00 2 0x01 1 / THYST 0x02 2 / TOS 0x03 2 / 8 AW_I2C_SUBADDR_1BYTE AW_I2C_SUBADDR_MSB_FIRST AW_I2C_SUBADDR_LSB_FIRST LM75B AW_I2C_ADDR_7BIT AW_I2C_SUBADDR_1BYTE LM75B LM75B aw_i2c_device_t lm75_dev; // LM75B 2 aw_i2c_mkdev( 3 &lm75_dev, // LM75B 4 0, // I 2 C0 5 0x48, // 7bit 0x48 6 AW_I2C_ADDR_7BIT AW_I2C_SUBADDR_1BYTE); // 7bit 1 166

180 3 I 2 C aw_err_t aw_i2c_read( aw_i2c_device_t *p_dev, uint32_t uint8_t size_t subaddr, *p_buf, nbytes); p_dev I 2 C subaddr p_buf nbytes AW_OK 7.16 LM75B uint8_t temp_buf[2]; // 2 aw_i2c_read (&lm75_dev, 0x00, temp_buf, 2); // 0x bit n LM75B 3 5 0LM75B int16_t temp = (temp_buf[0] << 8) (temp_buf[1] & 0xE0); 5 1 0xE temp 256 LM75B LM75B #include "aworks.h" 2 #include "aw_i2c.h" 3 #include "aw_delay.h" 4 #include "aw_vdebug.h" 5 6 int aw_main() 7 { 167

181 8 aw_i2c_device_t lm75_dev; // LM75B 9 uint8_t temp_buf[2]; // 10 int16_t temp; aw_i2c_mkdev( 13 &lm75_dev, // LM75B 14 0, // I 2 C0 15 0x48, // 7bit 0x48 16 AW_I2C_ADDR_7BIT AW_I2C_SUBADDR_1BYTE); // 7bit while(1) { 19 aw_i2c_read (&lm75_dev, 0x00, temp_buf, 2); // 0x temp = (temp_buf[0] << 8) (temp_buf[1] & 0xE0); 21 aw_kprintf("cur temp is : %d.%03d\r\n", temp / 256, (temp * 1000 / 256) % 1000); 22 aw_mdelay(1000); 23 } 24 } aw_kprintf() aw_kprintf() aw_kprintf("cur temp : %f\r\n", temp / 256.0f); temp 256 temp temp = temp / 256 = 2912 / 256 // C = 11 = (temp * 1000 / 256) % 1000 = (2912 * 1000 / 256) % 1000 = / 256 % 1000 = % 1000 = 375 Cur temp is : FPU MCU AWorks MCU 168

182 I 2 C LM75B I 2 C AWorks 4 I 2 C aw_err_t aw_i2c_write( aw_i2c_device_t uint32_t const void size_t *p_dev, subaddr, *p_buf, nbytes); p_dev I 2 C subaddr p_buf nbytes AW_OK 7.16 LM75B 0x02 0x03 2 T hyst T ost hyst T ost hyst 75T os temp temp * 256 = x5080 LM75B OS LM75B LM75B LM75B T OS OS T HYST OS LM75B T OS T OS OS LM75B OS T HYST T HYST OS LM75B OS T OS T OS OS LM75B OS 169

183 OS LM75B LM75B AWorks I 2 C I 2 C T OS 80.5 T OS 0x5080 0x50 0x uint8_t temp_buf[2]; // 2 temp_buf[0] = 0x50; // 3 temp_buf[1] = 0x80; // 4 aw_i2c_write (&lm75_dev, 0x03, temp_buf, 2); // 0x03 Tos T OS I 2 C T OS #include "aworks.h" 2 #include "aw_i2c.h" 3 #include "aw_delay.h" 4 #include "aw_vdebug.h" 5 int aw_main() 6 { 7 aw_i2c_device_t lm75_dev; // LM75B 8 uint8_t temp_buf[2]; // 9 aw_i2c_mkdev(&lm75_dev, // LM75B 10 0, // I 2 C0 11 0x48, // 7bit 0x48 12 AW_I2C_ADDR_7BIT AW_I2C_SUBADDR_1BYTE); 13 temp_buf[0] = 0x50; // 14 temp_buf[1] = 0x80; // 15 aw_i2c_write (&lm75_dev, 0x03, temp_buf, 2); // 0x03 Tos temp_buf[0] = 0x00; // 18 temp_buf[1] = 0x00; 19 aw_i2c_read (&lm75_dev, 0x03, temp_buf, 2); // 0x03 Tos if ((temp_buf[0] == 0x50) && (temp_buf[1] == 0x80)) { 22 aw_kprintf("write Tos successful!\r\n"); // 23 } else { 24 aw_kprintf("write Tos failed!\r\n"); // 25 } 26 while(1) { 27 aw_mdelay(1000); 28 } 29 } 170

184 7.5 UART UART UARTUniversal Asynchronous Receiver/Transmitter RXD TXD UART bit byte / us us 13us

185 7.5.2 AWorks UART aw_serial.h aw_err_t aw_serial_ioctl (int com, int request, void *p_arg); UART ssize_t aw_serial_write (int com, const char *p_buffer, size_t nbytes); ssize_t aw_serial_read (int com, char *p_buffer, size_t maxbytes); 1 UART UART aw_err_t aw_serial_ioctl (int com, int request, void *p_arg); com IDrequest p_arg request request AW_OK i.mx28x ID ID DUART COM0 AUART2 COM3 AUART0 COM1 AUART3 COM4 AUART1 COM2 AUART4 COM5 COM0 ~ COM5 aw_serial.h #define COM0 0 #define COM1 1 #define COM2 2 #define COM3 3 #define COM4 4 #define COM5 5 request p_arg p_arg UART request p_arg SIO_BAUD_SET uint32_t SIO_BAUD_GET uint32_t * SIO_HW_OPTS_SET uint32_t SIO_HW_OPTS_GET uint32_t * 172

186 SIO_BAUD_SET SIO_ aw_sio_common.h aw_serial.h aw_serial_ioctl(com1, SIO_BAUD_SET, (void *)115200); SIO_BAUD_GET uint32_t baud; 2 aw_serial_ioctl(com1, SIO_BAUD_GET, (void *)&baud); 3 aw_kprintf("the baud rate is %d\r\n", baud); SIO_HW_OPTS_SET p_arg UART aw_sio_common.h CS5 CS6 CS7 CS8 STOPB PARENB PARODD // aw_serial_ioctl(com1, SIO_HW_OPTS_SET, (void *)(CS8)); 3 4 // aw_serial_ioctl(com1, SIO_HW_OPTS_SET, (void *)(CS8 STOPB)); 6 7 // aw_serial_ioctl(com1, SIO_HW_OPTS_SET, (void *)(CS8 PARENB)); 9 10 // aw_serial_ioctl(com1, SIO_HW_OPTS_SET, (void *)(CS8 PARENB PARODD)); SIO_HW_OPTS_GET 173

187 aw_serial_ioctl(com1, SIO_HW_OPTS_GET, (void *)&ops); 2 3 if (ops & PARENB) { 4 if (ops & PARODD) { 5 // 6 } else { 7 // 8 } 9 } else { 10 // 11 } 2 AWorks 128 ssize_t aw_serial_write (int com, const char *p_buffer, size_t nbytes); com p_buffer nbytes Hello World! uint8_t str[] = "Hello World!"; 2 aw_serial_write(com1, str, sizeo(str)); 3 AWorks 128 AW_FIONREAD COM int nread; 2 aw_serial_ioctl(com1, AW_FIONREAD, (void *)&nread); ssize_t aw_serial_read (int com, char *p_buffer, size_t maxbytes); com p_buffer maxbytes p_buffer 174

188 char rxbuf[10]; 2 aw_serial_read (COM1, rxbuf, 10); // 10 maxbytes maxbytes maxbytes maxbytes maxbytes AW_TIOCRDTIMEOUT aw_ioctl.h 100ms ms 1 aw_serial_ioctl(com1, AW_TIOCRDTIMEOUT, (void *)100); LED0 on LED0off LED0onoffOK! Failed! Unknown Command! LED0 1 #include "aworks.h" 2 #include "aw_serial.h" 3 #include "aw_delay.h" 4 #include "aw_vdebug.h" 5 #include "aw_ioctl.h" 6 #include "aw_led.h" 7 #include "string.h" 8 9 int aw_main() 10 { 11 char rxbuf[3]; // 12 ssize_t nread; 13 const char *p_help_str = "Send on to turn on the led0, send off to turn off the led0!\r\n"; 14 const char *p_failed_str = "Failed! Unknown Command!"; // aw_serial_ioctl(com1, SIO_BAUD_SET, (void *)115200); 18 aw_serial_ioctl(com1, SIO_HW_OPTS_SET, (void *)(CS8)); // 100ms 21 aw_serial_ioctl(com1, AW_TIOCRDTIMEOUT, (void *)100); // 24 aw_serial_write(com1, p_help_str, strlen(p_help_str));

189 26 while(1) { 27 nread = aw_serial_read (COM1, rxbuf, 3); 28 if (nread > 0) { 29 if (strncmp((const char *)rxbuf, "on", 2) == 0) { 30 aw_led_on(0); 31 aw_serial_write(com1, "OK!", strlen("ok!")); // "OK!" 32 } else if (strncmp((const char *)rxbuf, "off", 3) == 0) { 33 aw_led_off(0); 34 aw_serial_write(com1, "OK!", strlen("ok!")); // "OK!" 35 } else { 36 aw_serial_write(com1, p_failed_str, strlen(p_failed_str)); // 37 } 38 } 39 } 40 } 7.6 A/D ~0.50.5~1.51.5~ ~ ~ S/N 176

190 A/D 0V 256 /2565/ mV MCU A/D 5V 3V /2553/525599H 1%3/ H 2~3% A/D 3 A/D A/D A/D 5V 8 A/D 19.5mV 19.5mV mV~39mV 1 39mV~58.6mV 2 5V 2.5V 2.5/2569.7mV 2.5V A/D 5V 12 A/D mV 12 A/D 1.22mV 10mV 10mV 4 5% 12 A/D A/D MCU 5 12 A/D 1LSB 1/2 12 =244ppm % 100ppm 10ppm/ 100ppm 200ppm

191 n ADC 1/2 n 1LSB 1/2 n 1/2 n /2LSB 2 1/2 n+1 1/2 n ADC n 1LSB T TC TC ΔT 25-40~+85ΔT ~1008~20 ADC 1LSB TC TC TL431 REF3325/ TL ~36V 1~100mA REF TC 2.5VREF V 7.22 % V ma V ma ppm/ TL ~36 1 ~ ~85 REF ~ ~125 REF ~ ~125 REF33xx SC70-3 SOT23-3 5μA REF33xx REF33xx 180mV REF V 178

192 REF3325/3330 TL431 TL431 LDO 12bits AD 0.1% 1LSB ~ bits % 50ppm REF3325/ A/D AWorks A/D ADC aw_err_t aw_adc_rate_get( aw_adc_channel_t ch, ADC uint32_t *p_rate); aw_err_t aw_adc_rate_set( aw_adc_channel_t ch, ADC uint32_t rate); int aw_adc_vref_get(aw_adc_channel_t ch); int aw_adc_bits_get(aw_adc_channel_t ch); ADC aw_err_t aw_adc_sync_read( aw_adc_channel_t ch, void *p_val, uint32_t samples, bool_t urgent); void aw_adc_mkbufdesc ( aw_adc_buf_desc_t *p_desc, ADC void *p_buf, uint32_t length, pfn_adc_complete_t pfn_complete, void *p_arg); 179

193 aw_err_t aw_adc_client_init( aw_adc_client_t *p_client, aw_adc_channel_t ch, bool_t urgent); aw_err_t aw_adc_client_start( aw_adc_client_t *p_client, aw_adc_buf_desc_t *p_desc, int desc_num, uint32_t count); aw_err_t aw_adc_client_cancel( aw_adc_client_t *p_client); 1 ADC 1 ADC ADC Samples/s aw_err_t aw_adc_rate_get(aw_adc_channel_t ch, uint32_t *p_rate); ch ADC p_rate AW_OK A/D A/D AWorks i.mx28x LRADC HSADC A/D 16 8 {chip}_adc_def.h i.mx28x imx28x_adc_def.h #define IMX28_LRADC_CH0 0 #define IMX28_LRADC_CH1 1 #define IMX28_LRADC_CH2 2 #define IMX28_LRADC_CH3 3 #define IMX28_LRADC_CH4 4 #define IMX28_LRADC_CH5 5 #define IMX28_LRADC_CH6 6 #define IMX28_LRADC_BAT_CH7 7 #define IMX28_LRADC_TMP0_CH8 8 #define IMX28_LRADC_TMP1_CH9 9 #define IMX28_LRADC_VDDIO_CH10 10 #define IMX28_LRADC_VTH_CH

194 #define IMX28_LRADC_VDDA_CH12 12 #define IMX28_LRADC_VDDD_CH13 13 #define IMX28_LRADC_VBG_CH14 14 #define IMX28_LRADC_5VIN_CH15 15 #define IMX28_HSADC_LRADCPIN0 16 #define IMX28_HSADC_LRADCPIN1 17 #define IMX28_HSADC_LRADCPIN2 18 #define IMX28_HSADC_LRADCPIN3 19 #define IMX28_HSADC_LRADCPIN4 20 #define IMX28_HSADC_LRADCPIN5 21 #define IMX28_HSADC_LRADCPIN6 22 #define IMX28_HSADC_HSADCPIN ~ 23 ADC aw_adc_channel_t 24 uint8_t uint32_t rate; // 2 aw_adc_rate_get(0, &rate); // 0 2 ADC 2 A/D aw_err_t aw_adc_rate_set(aw_adc_channel_t ch, uint32_t rate); ch ADC rate AW_OK A/D aw_adc_rate_get() A/D aw_adc_rate_set(0, 1000); 1000 Samples/s ms 3 ADC MCU 181

195 ADC ADC ADC int aw_adc_vref_get(aw_adc_channel_t ch); ch ADC 0 mv int vref = aw_adc_vref_get(0); 2 if (vref < 0 ) { 3 aw_kprintf("the ADC reference voltage get failed!\r\n"); 4 } else { 5 aw_kprintf("the ADC reference voltage is %d mv.\r\n", vref); 6 } 2.5V vref ADC ADC int aw_adc_bits_get(aw_adc_channel_t ch); ch ADC int bits = aw_adc_bits_get(0); 2 if (bits < 0 ) { 3 aw_kprintf("the ADC bits get failed!\r\n"); 4 } else { 5 aw_kprintf("the ADC bits is %d.\r\n", bits); 6 } i.mx28x LRADC HSADC 12 AD bits 12 2 ADC aw_err_t aw_adc_sync_read(aw_adc_channel_t void uint32_t bool_t ch, *p_val, samples, urgent); ch ADC p_val samples urgent AW_OK p_val ADC ADC 1 ~ 8 uint8_t ADC 9 ~ 16 uint16_t ADC 182

196 17 ~ 32 uint32_t i.mx28x ADC 12 uint16_t ADC uint16_t adc_val[100]; samples p_val p_val samples ADC A/D A/D urgent urgent TRUE A/D urgent FALSE urgent FALSE uint16_t adc_val[100]; 2 aw_adc_sync_read(0, adc_val, 100, FALSE); adc_val uint16_t adc_val[100]; 2 uint32_t sum = 0; 3 uint16_t code; 4 int i; 5 6 aw_adc_sync_read(0, adc_val, 100, FALSE); 7 8 for (i = 0; i < 100; i++) { 9 sum += adc_val[i]; 10 } code = sum / 100; sum sum 32 code ADC A/D ADC code vol code * / 2 V ref bits 183

197 code V ref bits ADC 2 bits vol code * Vref /(1 bits) #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_adc.h" 5 6 #define N_SAMPLES_PER_READ 100 // static uint16_t g_adc_val[n_samples_per_read]; // 9 10 int aw_main() 11 { 12 uint32_t sum = 0; 13 uint16_t code; 14 int vol; 15 int i; 16 int bits = aw_adc_bits_get(0); 17 int vref = aw_adc_vref_get(0); if ((bits < 0) vref < 0) { 20 aw_kprintf("adc info get failed!\r\n"); 21 while (1) { 22 aw_mdelay(1000); 23 } 24 } 25 while (1) { 26 aw_adc_sync_read(0, g_adc_val, N_SAMPLES_PER_READ, FALSE); 27 sum = 0; 28 for (i = 0; i < 100; i++) { 29 sum += g_adc_val[i]; 30 } 31 code = sum / 100; 32 vol = (float)(code * vref) / (float)(1 << bits); 33 aw_kprintf("the vol of channel 0 is : %d mv \r\n", vol); 34 aw_mdelay(1000); 35 } 36 } i.mx28x 0 LRADC0 184

198 ADC vol mv vol float float vol; vol = (float)(code * vref) / (float)(1 << bits); 3 ADC ADC ADC 1 ADC void aw_adc_mkbufdesc (aw_adc_buf_desc_t void uint32_t pfn_adc_complete_t void *p_desc, *p_buf, length, pfn_complete, *p_arg); p_desc aw_adc_buf_desc_t aw_adc_buf_desc_t buf_desc; buf_desc p_desc buf_desc p_buf ADC ADC 1 ~ 8 uint8_t ADC 9 ~ 16 uint16_t ADC 17 ~ 32 uint32_t ADC 100 uint16_t adc_buf[100]; length pfn_complete p_buf pfn_complete p_arg p_arg pfn_adc_complete_taw_adc.h typedef void (*pfn_adc_complete_t) (void *p_cookie, aw_err_t state); p_cookie state p_cookie 185

199 aw_adc_mkbufdesc() p_arg state ADC AW_OK aw_adc_buf_desc_t buf_desc; 2 uint16_t buf[100]; // 100 ADC 12 ADC uint16_t 3 4 static void buf_complete (void *p_cookie, aw_err_t state) 5 { 6 if (state == AW_OK) { 7 // buf 8 } else { 9 // 10 } 11 } int aw_main (void) 14 { 15 aw_adc_mkbufdesc(&buf_desc, 16 buf, , 18 buf_complete, 19 NULL); 20 // ADC } ADC ADC ADC 2 aw_err_t aw_adc_client_init( aw_adc_client_t aw_adc_channel_t bool_t *p_client, ch, urgent); p_client aw_adc_client_t aw_adc_client_t client; client p_client client 186

200 ch ch urgent A/D A/D urgent urgent TRUE urgent FALSE urgent FALSE aw_adc_client_t client; 2 aw_adc_client_init(&client, 0, FALSE); aw_adc_client_t client[3]; // aw_adc_client_init(&client[0], 0, FALSE); // aw_adc_client_init(&client[1], 1, FALSE); // aw_adc_client_init(&client[2], 2, FALSE); // aw_err_t aw_adc_client_start( aw_adc_client_t *p_client, aw_adc_buf_desc_t *p_desc, int desc_num, uint32_t count); p_client p_desc ADC desc_num desc_num > 1 count 187

201 desc_num desc_num 2 count count 0ADC AW_OK ADC #include "aworks.h" 2 #include "aw_adc.h" 3 4 static aw_adc_client_t g_client; 5 static aw_adc_buf_desc_t g_buf_desc; 6 static uint16_t g_buf [100]; // ADC uint16_t 7 8 static void buf_complete (void *p_cookie, aw_err_t state) 9 { 10 // g_buf } int aw_main (void) 14 { 15 aw_adc_client_init(& g_client, 0, FALSE); // 18 aw_adc_mkbufdesc(& g_buf_desc, g_buf, 100, buf_complete, NULL); aw_adc_client_start(& g_client, & g_buf_desc, 1, 1); 21 // } #include "aworks.h" 2 #include "aw_adc.h" 3 4 static aw_adc_client_t g_client; 5 static aw_adc_buf_desc_t g_buf_desc; 6 static uint16_t g_buf [100]; // ADC uint16_t 7 8 static volatile int g_flag; 188

202 9 10 static void buf_complete (void *p_cookie, aw_err_t state) 11 { 12 g_flag = 1; 13 } int aw_main (void) 16 { 17 aw_adc_client_init(& g_client, 0, FALSE); 18 // 19 aw_adc_mkbufdesc(& g_buf_desc, g_buf, 100, buf_complete, NULL); 20 g_flag = 0; 21 aw_adc_client_start(& g_client, & g_buf_desc, 1, 1); 22 while (1) { 23 if ( g_flag == 1) { 24 // 25 // 26 aw_adc_client_start(& g_client, & g_buf_desc, 1, 1); 27 } 28 // 29 } 30 } CPU AWorks OS 10 3 ADC #include "aworks.h" 2 #include "aw_adc.h" 3 4 static aw_adc_client_t g_client[3]; 5 static aw_adc_buf_desc_t g_buf_desc[3]; 6 static uint16_t g_buf[3][100]; // ADC uint16_t 7 8 static void buf_complete (void *p_cookie, aw_err_t state) 9 { 10 int ch = (int)p_cookie; // p_arg 11 if (ch == 0) { 12 // 0 13 } else if (ch == 1) { 14 // 1 189

203 15 } else { 16 // 2 17 } 18 } int aw_main (void) 21 { 22 int i; 23 for (i = 0; i < 3; i++) { 24 aw_adc_client_init(& g_client[i], i, FALSE); // 25 // 26 aw_adc_mkbufdesc(& g_buf_desc[i], g_buf[i], 100, buf_complete, (void *)i); 27 aw_adc_client_start(& g_client[i], & g_buf_desc[i], 1, 1); 28 } 29 // 30 } ADC #include "aworks.h" 2 #include "aw_adc.h" 3 4 static aw_adc_client_t g_client; 5 static aw_adc_buf_desc_t g_buf_desc[2]; 6 static uint16_t g_buf[2][100]; // ADC uint16_t 7 8 static void buf0_complete (void *p_cookie, aw_err_t state) 9 { 10 // g_buf[0] } static void buf1_complete (void *p_cookie, aw_err_t state) 14 { 15 // g_buf[1] } int aw_main (void) 19 { 20 aw_adc_client_init(& g_client, 0, FALSE); // 23 aw_adc_mkbufdesc(& g_buf_desc[0], g_buf[0], 100, buf0_complete, NULL); 24 aw_adc_mkbufdesc(& g_buf_desc[1], g_buf[1], 100, buf1_complete, NULL); 190

204 25 26 aw_adc_client_start(& g_client, & g_buf_desc[0], 2, 0); 27 // } 4 ADC ADC aw_err_t aw_adc_client_cancel(aw_adc_client_t *p_client); p_client AW_OK -AW_EPERM #include "aworks.h" 2 #include "aw_adc.h" 3 4 static aw_adc_client_t g_client; 5 static aw_adc_buf_desc_t g_buf_desc[2]; 6 static uint16_t g_buf[2][100]; // ADC uint16_t 7 8 static void buf0_complete (void *p_cookie, aw_err_t state) 9 { 10 // g_buf[0] } static void buf1_complete (void *p_cookie, aw_err_t state) 14 { 15 // g_buf[1] } 17 int aw_main (void) 18 { 19 aw_adc_client_init(& g_client, 0, FALSE); // 22 aw_adc_mkbufdesc(& g_buf_desc[0], g_buf[0], 100, buf0_complete, NULL); 23 aw_adc_mkbufdesc(& g_buf_desc[0], g_buf[1], 100, buf1_complete, NULL); aw_adc_client_start(& g_client, & g_buf_desc[0], 2, 0); // aw_mdelay(1000 * 60 * 60); // 1 28 aw_adc_client_cancel(& g_client); // 29 //

205 30 } 7.7 D/A D/A A/D D/A 0V ~ 3 D/A D/A 8 D/A 0 ~ N D/A 2 N 2 N N D/A code Vref bits D/A 8 D/A 256 5V / 2565 / mV 0 0V mV 2 39mV D/A D/A D/A AWorks D/A

206 7.24 DAC int aw_dac_bits_get(aw_dac_channel_t ch); DAC int aw_dac_vref_get(aw_dac_channel_t ch); DAC aw_err_t aw_dac_val_set(aw_dac_channel_t ch, aw_dac_val_t val); DAC aw_err_t aw_dac_mv_set(aw_dac_channel_t ch, int mv); DAC aw_err_t aw_dac_enable(aw_dac_channel_t ch); DAC aw_err_t aw_dac_disable(aw_dac_channel_t ch); DAC 1 DAC DAC int aw_dac_bits_get(aw_dac_channel_t ch); ch DAC D/A D/A AWorks i.mx28x D/A i.mx28x D/A D/A AD5689R 15 D/A D/A D/A D/A 0 0 AD5689R DAC 1 int dac_bits = aw_dac_bits_get(0); // DAC 0 2 DAC MCU DAC DAC DAC int aw_dac_vref_get(aw_dac_channel_t ch); ch DAC 0 mv V DAC 1 int dac_bits = aw_dac_vref_get(0); // DAC 0 2 if (vref < 0 ) { 3 aw_kprintf("the DAC reference voltage get failed!\r\n"); 4 } else { 193

207 5 aw_kprintf("the DAC reference voltage is %d mv.\r\n", vref); 6 } 3 DAC DAC 1 aw_err_t aw_dac_val_set(aw_dac_channel_t ch, aw_dac_val_t val); ch DAC AW_OK D/A code D/A 24 3V 2.25V code DAC 1 aw_dac_val_set(0, ); // DAC V 4 DAC DAC AWorks aw_err_t aw_dac_mv_set(aw_dac_channel_t ch, int mv); ch DAC mv mv AW_OK V DAC aw_dac_mv_set(0, 2250); // DAC V 5 DAC DAC DAC DAC aw_err_t aw_dac_enable (aw_dac_channel_t ch); 194

208 ch DAC AW_OK DAC 1 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_dac.h" 5 6 int aw_main() 7 { 8 aw_dac_mv_set(0, 2250); // DAC V 9 aw_dac_enable(0); // 2.25V 10 while(1) { 11 } 12 } 6 DAC DAC DAC aw_err_t aw_dac_disable (aw_dac_channel_t ch); ch DAC AW_OK DAC 1 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_dac.h" 5 6 int aw_main() 7 { 8 aw_dac_mv_set(0, 2250); // DAC V 9 aw_dac_enable(0); // 2.25V 10 aw_mdelay(10000); // 10s 11 aw_dac_disable(0); // 12 while(1) { 13 } 14 } 195

209 7.8 WDT WDTWatchDog Timer MCU MCU RST MCU WDT 255 MCU 7.18 WDT WDT 1/2 255WDT WDT MCU WDT MCU WDT WDT WDT BUG WDT 2 1 WDT WDT 196

210 i.mx28x WDT 32 1KHz WDT 1 0 WDT 0 i.mx28x WDT aw_prj_params.h AW_DEV_IMX28_WDT 2 MCU MCU 7.20 CAT823 i.mx28x AW280-64F8 CAT CAT823 1 /RESET MCU WDT 200ms MCU 2 GND 3 /MR RESET#1 RESET#1 4 WDI Watchdog Timer Input WDI WDT 5 VCC WDI 1.6s1.12s ~ 3.2s 1.12s MCU WDI IO RESET #1 200ms MCU AWorks WDT aw_prj_params.h AW_DEV_GPIO_WDT aw_prj_params.h AW_DEV_IMX28_WDT 3 AWorks AWorks LED ADC DAC AWorks 197

211 AWorks 7.22 AWorks AWorks AWorks aw_err_t aw_wdt_add (struct awbl_wdt *p_wdt, uint32_t t_ms); aw_err_t aw_wdt_feed (struct awbl_wdt *p_wdt); 1 aw_err_t aw_wdt_add (struct awbl_wdt *p_wdt, uint32_t t_ms); p_wdt struct awbl_wdt 198

212 struct awbl_wdt wdt; wdt p_wdt wdt t_ms ms AW_OK 1s struct awbl_wdt wdt; 2 aw_err_t ret = aw_wdt_add(&wdt, 1000); // 1s 3 if (ret!= AW_OK) { 4 // 5 } 2 aw_err_t aw_wdt_feed (struct awbl_wdt *p_wdt); p_wdt AW_OK s 1s 500ms while (1) { 2 aw_mdelay(500); 3 aw_wdt_feed(&wdt); 4 } LED #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_wdt.h" 4 #include "aw_led.h" 5 6 int aw_main (void) 199

213 7 { 8 struct awbl_wdt wdt; 9 aw_wdt_add(&wdt, 1000); // 1s LED 10 while (1) { 11 aw_led_toggle(0); // 500ms LED 12 aw_mdelay(500); 13 aw_wdt_feed(&wdt); // 14 } 15 } LED 500ms LED LED 1s LED LED AWorks 7.64 ADC ADC ADC #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_wdt.h" 4 #include "aw_adc.h" 5 #include "aw_led.h" 6 7 static aw_adc_client_t g_client; 8 static aw_adc_buf_desc_t g_buf_desc; 9 static uint16_t g_buf [100]; // ADC uint16_t static struct awbl_wdt g_wdt_led; 12 static struct awbl_wdt g_wdt_adc; static void buf_complete (void *p_cookie, aw_err_t state) 15 { 16 // g_buf aw_wdt_feed(& g_wdt_adc); // 19 aw_adc_client_start(& g_client, & g_buf_desc, 1, 1); // ADC 20 } int aw_main (void) 23 { 24 aw_wdt_add(& g_wdt_led, 1000); // 1s LED 25 aw_wdt_add(& g_wdt_adc, 2000); // 2s ADC 200

214 26 27 aw_adc_client_init(& g_client, 0, FALSE); 28 aw_adc_mkbufdesc(& g_buf_desc, g_buf, 100, buf_complete, NULL); 29 aw_adc_client_start(& g_client, & g_buf_desc, 1, 1); // ADC while (1) { 32 aw_led_toggle(0); 33 aw_mdelay(500); 34 aw_wdt_feed(& g_wdt_led); 35 } 36 } ADC aw_main() ADC 2s ADC buf_complete ADC 100 2s ADC 100 ADC 2s 2 AWorks

215 8 AWorks 8.1 AWorks AWorks aw_tm_t aw_time.h 1 typedef struct aw_tm { 2 int tm_sec; // 0 ~59 3 int tm_min; // 0 ~ 59 4 int tm_hour; // 0 ~ 23 5 int tm_mday; // 1 ~ 31 6 int tm_mon; // 0 ~ 11 7 int tm_year; // 8 int tm_wday; // 9 int tm_yday; // 10 int tm_isdst; // 11 } aw_tm_t; tm_sec 0 ~ 59tm_min 0 ~ 59tm_hour 0 ~ 23tm_mday 1 ~ 31tm_mon 0 ~ 11 1 ~ 12 1tm_year tm_wday 0 ~ 6 ~ tm_yday ~ tm_isdst tm_isdst tm_isdst 0 tm_isdst -1 Daylight Saving TimeDST :32:30 1 aw_tm_t tm = { 2 30, //

216 3 32, // , // , // , // , // , // 9 0, // 10-1 // 11 }; tm_wdaytm_yday :00:00 AWorks aw_time_t aw_time.h typedef time_t aw_time_t; :32: :00: aw_time_t time = ; AWorks AWorks aw_timespec_t aw_time.h typedef struct aw_timespec { aw_time_t tv_sec; // unsigned long tv_nsec; // } aw_timespec_t; tv_sec tv_nsec AWorks aw_time.h aw_err_t aw_tm_to_time (aw_tm_t *p_tm, aw_time_t *p_time); aw_err_t aw_time_to_tm (aw_time_t *p_time, aw_tm_t *p_tm); 203

217 1 aw_err_t aw_tm_to_time (aw_tm_t *p_tm, aw_time_t *p_time); p_tm p_time AW_OK :32: #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_time.h" 5 6 int aw_main() 7 { 8 aw_tm_t tm = { 9 30, // , // , // , // , // , // , // 16 0, // 17-1 // 18 }; aw_time_t time = 0; aw_tm_to_time(&tm, &time); 23 aw_kprintf("the time is : %d \r\n", time); while(1) { 26 aw_mdelay(1000); 27 } 28 } aw_err_t aw_time_to_tm (aw_time_t *p_time, aw_tm_t *p_tm); p_time p_tm AW_OK 204

218 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_time.h" 5 6 int aw_main() 7 { 8 aw_time_t time = ; 9 aw_tm_t tm; aw_time_to_tm(&time, &tm); aw_kprintf("the tm is : %04d-%02d-%02d %02d:%02d:%02d \r\n", 14 tm.tm_year+1900, tm.tm_mon + 1, tm.tm_mday, 15 tm.tm_hour, tm.tm_min, tm.tm_sec); 16 while(1) { 17 aw_mdelay(1000); 18 } 19 } :32: RTC RTCReal-Time Clock RTC RTC RTC RTC RTC RTC RTC RTC aw_rtc.h aw_err_t aw_rtc_time_get (int rtc_id, aw_tm_t *p_tm); aw_err_t aw_rtc_time_set (int rtc_id, aw_tm_t *p_tm); 1 RTC aw_err_t aw_rtc_time_get (int rtc_id, aw_tm_t *p_tm); rtc_id RTC RTC ID 0 RTC i.mx28x RTC RTC I 2 C PCF85063 RTC 205

219 2 RTC 01p_tm AW_OK rtc_id RTC ID RTC 1 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_rtc.h" 5 6 int aw_main() 7 { 8 aw_tm_t tm; 9 10 while(1) { 11 aw_rtc_time_get(0, &tm); 12 aw_kprintf("the tm is : %04d-%02d-%02d %02d:%02d:%02d \r\n", 13 tm.tm_year+1900, tm.tm_mon + 1, tm.tm_mday, 14 tm.tm_hour, tm.tm_min, tm.tm_sec); 15 aw_mdelay(1000); 16 } 17 } 2 RTC aw_err_t aw_rtc_time_set (int rtc_id, aw_tm_t *p_tm); rtc_id RTC p_tm AW_OK RTC ID :32: RTC 1 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_rtc.h" 5 6 int aw_main() 7 { 8 aw_tm_t tm = { 9 30, // , // , // , //

220 13 8-1, // , // , // 16 0, // 17-1 // 18 }; aw_rtc_time_set(0, &tm); while(1) { 23 aw_rtc_time_get(0, &tm); 24 aw_kprintf("the tm is : %04d-%02d-%02d %02d:%02d:%02d \r\n", 25 tm.tm_year+1900, tm.tm_mon + 1, tm.tm_mday, 26 tm.tm_hour, tm.tm_min, tm.tm_sec); 27 aw_mdelay(1000); 28 } 29 } 8.3 RTC rtc_id RTC RTC AWorks aw_time.h aw_err_t aw_tm_get (aw_tm_t *p_tv); aw_time_t aw_time(aw_time_t *p_time); aw_err_t aw_timespec_get(struct aw_timespec *p_tv); 1 aw_err_t aw_tm_get (aw_tm_t *p_tv); p_tv AW_OK #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 207

221 4 #include "aw_time.h" 5 6 int aw_main() 7 { 8 aw_tm_t tm; 9 10 while(1) { 11 aw_tm_get(&tm); 12 aw_kprintf("the tm is : %04d-%02d-%02d %02d:%02d:%02d \r\n", 13 tm.tm_year+1900, tm.tm_mon + 1, tm.tm_mday, 14 tm.tm_hour, tm.tm_min, tm.tm_sec); 15 aw_mdelay(1000); 16 } 17 } 1s :00:00 2 aw_time_t aw_time(aw_time_t *p_time); p_time NULL #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_time.h" 5 6 int aw_main() 7 { 8 aw_time_t time; 9 10 while(1) { 11 aw_time(&time); 12 aw_kprintf("the time is :%d\r\n", time); 13 aw_mdelay(1000); 14 } 15 } 1s :00:

222 8.8 1 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_time.h" 5 6 int aw_main() 7 { 8 while(1) { 9 aw_kprintf("the time is :%d\r\n", aw_time(null)); 10 aw_mdelay(1000); 11 } 12 } 3 aw_err_t aw_timespec_get(struct aw_timespec *p_tv); p_tv AW_OK #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_time.h" 5 6 int aw_main() 7 { 8 aw_timespec_t tv; 9 10 while(1) { 11 aw_timespec_get(&tv); 12 aw_kprintf("the time is : %d:%d\r\n", tv.tv_sec, tv.tv_nsec); 13 aw_mdelay(50); 14 } 15 } 2ms ~

223 aw_time.h aw_err_t aw_tm_set (aw_tm_t *p_tm); aw_err_t aw_timespec_set(struct aw_timespec *p_tv); 1 aw_err_t aw_tm_set (aw_tm_t *p_tm); p_tm AW_OK tm_wday, tm_yday :32: #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_time.h" 5 6 int aw_main() 7 { 8 aw_tm_t tm = { 9 30, // , // , // , // , // , // , // 16 0, // 17-1 // 18 }; 19 aw_tm_set(&tm); // 20 while(1) { 21 aw_tm_get(&tm); // 22 aw_kprintf("the tm is : %04d-%02d-%02d %02d:%02d:%02d \r\n", 23 tm.tm_year+1900, tm.tm_mon + 1, tm.tm_mday, 24 tm.tm_hour, tm.tm_min, tm.tm_sec); 25 aw_mdelay(1000); 26 } 27 } 210

224 :32:30 while(1) 1s 2 aw_err_t aw_timespec_set(struct aw_timespec *p_tv); p_tv AW_OK #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_time.h" 5 6 int aw_main() 7 { 8 aw_timespec_t tv = { , 0}; 9 aw_tm_t tm; aw_timespec_set(&tv); while(1) { 14 aw_tm_get(&tm); 15 aw_kprintf("the tm is : %04d-%02d-%02d %02d:%02d:%02d \r\n", 16 tm.tm_year+1900, tm.tm_mon + 1, tm.tm_mday, 17 tm.tm_hour, tm.tm_min, tm.tm_sec); 18 aw_mdelay(1000); 19 } 20 } while(1) 1s

225 1 0 AWorks aw_system.h unsigned long aw_sys_clkrate_get (void); aw_tick_t aw_sys_tick_get (void);, aw_tick_t aw_sys_tick_diff(aw_tick_t t0, aw_tick_t t1); unsigned int aw_ticks_to_ms (aw_tick_t ticks); aw_tick_t aw_ms_to_ticks (unsigned int ms); 1 CPU CPU CPU CPU Hz KHz unsigned long aw_sys_clkrate_get (void); KHz 1ms #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_system.h" 5 6 int aw_main() 7 { 8 unsigned long rate = aw_sys_clkrate_get(); 9 aw_kprintf("the system clkrate is : %d Hz \r\n", rate); 10 while(1) { 11 aw_mdelay(1000); 12 } 13 } aw_tick_t aw_sys_tick_get (void); aw_tick_t 212

226 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_system.h" 5 6 int aw_main() 7 { 8 volatile unsigned int i; 9 aw_tick_t t0, t1; 10 unsigned long rate = aw_sys_clkrate_get(); t0 = aw_sys_tick_get(); 13 for (i = 0; i < ; i++) { 14 ; 15 } 16 t1 = aw_sys_tick_get(); aw_kprintf("tick used = %d, time = %d ms", 19 t1 - t0, 20 (t1 - t0) * 1000 / rate); // 1000 ms 21 while(1) { 22 aw_mdelay(1000); 23 } 24 } for t1 t0 for 1000 AWorks 3 aw_tick_t aw_sys_tick_diff(aw_tick_t t0, aw_tick_t t1); t0 t

227 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_system.h" 5 6 int aw_main() 7 { 8 volatile unsigned int i; 9 aw_tick_t t0,t1; 10 unsigned long rate = aw_sys_clkrate_get(); t0 = aw_sys_tick_get(); 13 for (i = 0; i < ; i++) { 14 ; 15 } 16 t1 = aw_sys_tick_get(); aw_kprintf("tick used = %d, time = %d ms", 19 aw_sys_tick_diff(t0, t1), 20 aw_sys_tick_diff(t0, t1) * 1000 / rate); // 1000 ms 21 while(1) { 22 aw_mdelay(1000); 23 } 24 } 4 unsigned int aw_ticks_to_ms (aw_tick_t ticks); ticks #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_system.h" 5 6 int aw_main() 7 { 8 volatile unsigned int i; 9 aw_tick_t t0, t1; 214

228 10 t0 = aw_sys_tick_get(); 11 for (i = 0; i < ; i++) { 12 ; 13 } 14 t1 = aw_sys_tick_get(); 15 aw_kprintf("tick used = %d, time = %d ms", 16 aw_sys_tick_diff(t0, t1), 17 aw_ticks_to_ms(aw_sys_tick_diff(t0, t1))); 18 while(1) { 19 aw_mdelay(1000); 20 } 21 } 5 AWorks aw_tick_t aw_ms_to_ticks (unsigned int ms); ms 500ms #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_system.h" 5 6 int aw_main() 7 { 8 aw_kprintf("the ticks is : %d \r\n", aw_ms_to_ticks(500)); 9 while(1) { 10 aw_mdelay(1000); 11 } 12 } aw_timer.h void aw_timer_init (aw_timer_t *p_timer, aw_pfuncvoid_t p_func, void *p_arg); void aw_timer_start (aw_timer_t *p_timer, unsigned int ticks); void aw_timer_stop (aw_timer_t *p_timer); 215

229 1 AWorks aw_timer_t aw_timer.h aw_timer_t timer; // timer p_timer 3 1s1.5s2.5s 3 aw_timer_t timer0; // timer0 aw_timer_t timer1; // timer1 aw_timer_t timer2; // timer2 2 void aw_timer_init (aw_timer_t *p_timer, aw_pfuncvoid_t p_func, void *p_arg); p_timer p_func p_func aw_pfuncvoid_t aw_types.h typedef void (*aw_pfuncvoid_t) (void *); p_func void* p_arg p_arg NULL #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_timer.h" 4 5 static aw_timer_t g_my_timer; // 6 7 static void timer_callback (void *p_arg) 8 { 9 // 10 } int aw_main() 13 { 216

230 14 aw_timer_init(& g_my_timer, timer_callback, NULL); // 15 while(1) { 16 aw_mdelay(1000); 17 } 18 } void aw_timer_start (aw_timer_t *p_timer, unsigned int ticks); p_timer ticks 500ms #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_timer.h" 4 #include "aw_led.h" 5 #include "aw_system.h" 6 7 static aw_timer_t g_my_timer; // 8 9 static void timer_callback (void *p_arg) 10 { 11 // 12 aw_led_toggle(0); 13 } int aw_main() 16 { 17 aw_timer_init(& g_my_timer, timer_callback, NULL); // 18 aw_timer_start(& g_my_timer, aw_ms_to_ticks(500)); // 19 while(1) { 20 aw_mdelay(1000); 21 } 22 } 500ms LED 500ms LED LED

231 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_timer.h" 4 #include "aw_led.h" 5 #include "aw_system.h" 6 7 static aw_timer_t g_my_timer; // 8 9 static void timer_callback (void *p_arg) 10 { 11 aw_led_toggle(0); 12 aw_timer_start(& g_my_timer, aw_ms_to_ticks(500)); // 13 } int aw_main() 16 { 17 aw_timer_init(& g_my_timer, timer_callback, NULL); // 18 aw_timer_start(& g_my_timer, aw_ms_to_ticks(500)); // 19 while(1) { 20 aw_mdelay(1000); 21 } 22 } 4 void aw_timer_stop (aw_timer_t *p_timer); p_timer 8.19 LED 10s 10s #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_timer.h" 4 #include "aw_led.h" 5 #include "aw_system.h" 6 7 static aw_timer_t g_my_timer; // 8 9 static void timer_callback (void *p_arg) 10 { 11 aw_led_toggle(0); 12 aw_timer_start(& g_my_timer, aw_ms_to_ticks(500)); // 218

232 13 } int aw_main() 16 { 17 aw_timer_init(& g_my_timer, timer_callback, NULL); // 18 aw_timer_start(& g_my_timer, aw_ms_to_ticks(500)); // aw_mdelay(10000); // 10s 21 aw_timer_stop(& g_my_timer); while(1) { 24 aw_mdelay(1000); 25 } 26 } aw_timer_start() 219

233 9 CPU K 1KB AWorks 9.1 C malloc()/free()

234

235 magicusedp_nextp_prev

236 9.12 magic magic magic used 0 1 p_next p_prev

237 9.1.2 AWorks aw_memheap.h aw_err_t aw_memheap_init(aw_memheap_t const char void uint32_t *memheap, *name, *start_addr, size); void *aw_memheap_alloc(aw_memheap_t *heap, uint32_t size); void *aw_memheap_realloc(aw_memheap_t void size_t void aw_memheap_free(void *ptr); 1 *heap, *ptr, newsize); aw_memheap_t aw_memheap.h aw_memheap_t my_heap; // my_heap memheap AWorks aw_memheap_t heap0; // 0 aw_memheap_t heap1; // 1 aw_memheap_t heap2; // 2 2 aw_err_t aw_memheap_init (aw_memheap_t const char void uint32_t *memheap, *name, *start_addr, size); memheap name start_addr size AW_OK 224

238 1KB #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_memheap.h" 5 6 static uint8_t g_my_heap_mem[1024]; // static aw_memheap_t g_my_heap; // 8 9 int aw_main (void) 10 { 11 int err = aw_memheap_init(& g_my_heap, 12 "my_heap", // 13 g_my_heap_mem, // 14 sizeof( g_my_heap_mem)); // 15 if (err == AW_OK) { // 16 aw_kprintf("init successful!\r\n" ); 17 } else { // 18 aw_kprintf("init Failed!\r\n"); 19 } 20 while(1) { 21 aw_mdelay(200); 22 } 23 } KB 3 void *aw_memheap_alloc (aw_memheap_t *heap, uint32_t size); heap size NULL void *

239 9.2 1 uint8_t *ptr; 2 int i; 3 4 ptr = (uint8_t *) aw_memheap_alloc(& g_my_heap, 100); 5 if (ptr!= NULL) { // 6 for (i = 0; i < 100; i++) { 7 ptr[i] = i; // 8 } 9 } else { 10 // 11 } aw_memheap_alloc() uint8_t aw_memheap_alloc() 0 ptr 4 void *aw_memheap_realloc(aw_memheap_t void size_t *heap, *ptr, newsize); heap ptr aw_memheap_alloc() aw_memheap_alloc()new_size NULL newsize new_size newsize 0 ptr NULL ptr ptr newsize ptr aw_memheap_alloc() uint8_t *ptr; 2 int i; 226

240 3 4 ptr = (uint8_t *) aw_memheap_alloc(& g_my_heap, 100); 5 if (ptr!= NULL) { // 6 for (i = 0; i < 100; i++) { 7 ptr[i] = i; // 8 } 9 ptr = (uint8_t *)aw_memheap_realloc(& g_my_heap, ptr, 200); // if (ptr!= NULL) { 11 for (i = 100; i < 200; i++) { 12 ptr[i] = i; // 13 } 14 } 15 } NULL ptr NULL ptr NULL uint8_t *new_ptr; 2 new_ptr = (uint8_t *)aw_memheap_realloc(& g_my_heap, ptr, 200); // if (new_ptr!= NULL) { // 4 ptr = new_ptr; // ptr 5 for (i = 100; i < 200; i++) { 6 ptr[i] = i; // 7 } 8 } else { 9 // ptr 10 } ptr ptr new_ptr 5 void aw_memheap_free(void *ptr); ptr aw_memheap_alloc() aw_memheap_realloc() ptr aw_memheap_free()

241 9.5 1 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_memheap.h" 5 6 static uint8_t g_my_heap_mem[1024]; // static aw_memheap_t g_my_heap; // 8 9 int aw_main (void) 10 { 11 uint8_t *ptr; 12 int i; int err = aw_memheap_init(& g_my_heap, 15 "my_heap", // 16 g_my_heap_mem, // 17 sizeof( g_my_heap_mem)); // 18 if (err == AW_OK) { // 19 aw_kprintf("init successful!\r\n" ); 20 ptr = (uint8_t *) aw_memheap_alloc(& g_my_heap, 100); 21 if (ptr!= NULL) { // 22 for (i = 0; i < 100; i++) { 23 ptr[i] = i; // 24 } 25 aw_memheap_free(ptr); // 26 ptr = NULL; 27 } 28 } else { // 29 aw_kprintf("init Failed!\r\n"); 30 } while(1) { 33 aw_mdelay(200); 34 } 35 } ptr NULL AWorks 228

242 9.1 6 static uint8_t g_my_heap_mem[1024]; AWorks ROM FLASH i.mx28x DDR AWorks AWorks AWorks AWorks aw_mem.h void *aw_mem_alloc(size_t size); void *aw_mem_calloc(size_t nelem, size_t size); void *aw_mem_align(size_t size, size_t align); void *aw_mem_realloc(void *ptr, size_t newsize); void aw_mem_free(void *ptr); 9.2 aw_mem_alloc() aw_mem_alloc() 1 void *aw_mem_alloc(size_t size) 2 { 3 return aw_memheap_alloc(& g_system_heap, size); 4 } g_system_heap 9.6 aw_mem_alloc() AWorks 229

243 1 aw_mem_alloc() C malloc() void *aw_mem_alloc(size_t size); size void * NULL int int *ptr; 2 ptr = (int *)aw_mem_alloc(sizeof(int)); // int 3 if (ptr!= NULL) { // 4 *ptr = 5; // 5 } aw_mem_alloc() int aw_mem_alloc() 0 ptr 2 aw_mem_alloc() aw_mem_calloc() C calloc() void *aw_mem_calloc(size_t nelem, size_t size); nelem size nelemsize nelemsize aw_mem_alloc() 0 10 int int 1 int *ptr; 2 ptr = (int *)aw_mem_calloc(10, sizeof(int)); // 10 int 3 if (ptr!= NULL) { // 4 ptr[0] = 5; // 5 ptr[1] = 6; 6 //... 7 } 0 ptr 0 3 aw_mem_align() void *aw_mem_align(size_t size, size_t align); size align align 230

244 align #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_mem.h" 5 int aw_main (void) 6 { 7 int *ptr = (int *)aw_mem_align(sizeof(int), 16); // 16 8 if (ptr!= NULL) { // 9 aw_kprintf("the start address is 0x%x\r\n", (unsigned int)ptr); 10 } else { 11 aw_kprintf("failed! Memory is not enough!\r\n"); 12 } 13 while(1) { 14 aw_mdelay(200); 15 } 16 } aw_kprintf() 16 aw_mem_alloc() 0 aw_memheap_alloc() aw_memheap_alloc() align aw_memheap_alloc() ~ (a) ~ 207 aw_memheap_alloc() 9.14(b) 9.14 align-1 231

245 align - 1 align align C % 0 align NN 1 align-n align N 1align - N align 1 align - 1 align-1 align-1 aw_memheap_alloc() ~ (a) ~ ~ (b) 9.15 align-1 align align AWorks CPU 32 4 aw_mem_alloc() aw_mem_alloc() 4 1 void *aw_mem_alloc(size_t size) 2 { 3 return aw_mem_align(size, 4); 4 } 4 void *aw_mem_realloc(void *ptr, size_t newsize); ptr aw_mem_alloc()aw_mem_calloc() aw_mem_align() new_size NULL aw_mem_alloc() 1 int 232

246 2 int #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_mem.h" 5 6 int aw_main (void) 7 { 8 int *ptr; 9 ptr = (int *)aw_mem_alloc(sizeof(int)); 10 if (ptr!= NULL) { // 11 *ptr = 5; // 12 ptr = (int *)aw_mem_realloc(ptr, sizeof(int) * 2); 13 if (ptr!= NULL) { 14 ptr[1] = 6; // 15 aw_kprintf("%d %d\r\n", ptr[0], ptr[1]); // int 16 } 17 } 18 while(1) { 19 aw_mdelay(200); 20 } 21 } 5 4 void aw_mem_free(void *ptr); ptr aw_mem_alloc()aw_mem_calloc()aw_mem_align() aw_mem_realloc() aw_mem_free() #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_mem.h" 5 int aw_main (void) 6 { 7 int *ptr = (int *)aw_mem_alloc(sizeof(int)); // 1 int 8 if (ptr!= NULL) { 9 *ptr = 5; // 233

247 10 aw_kprintf("%d\r\n", *ptr); 11 } 12 aw_mem_free(ptr); // 13 ptr = NULL; 14 while(1) { 15 aw_mdelay(200); 16 } 17 } 9.2 AWorks Memory Pool

248 p_next p_next p_next AWorks

249 9.3 aw_pool.h aw_pool_id_t aw_pool_init( aw_pool_t *p_pool, void *p_pool_mem, size_t pool_size, size_t item_size); size_t aw_pool_item_size (aw_pool_id_t pool_id); void *aw_pool_item_get (aw_pool_id_t pool_id); aw_err_t aw_pool_item_return ( aw_pool_id_t pool_id, void *p_item); 1 aw_pool_t aw_pool.h aw_pool_t pool; // pool p_pool AWorks aw_pool_t pool0; // 0 aw_pool_t pool1; // 1 aw_pool_t pool2; // aw_pool_id_t aw_pool_init ( aw_pool_t void size_t size_t *p_pool, *p_pool_mem, pool_size, item_size); p_pool aw_pool_t p_pool_mem pool_size item_size ID aw_pool_id_t ID ID NULL pool_size item_size 236

250 1KB #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_pool.h" 5 6 static aw_pool_t g_pool; // 7 static uint8_t g_pool_mem[1024]; // 8 9 int aw_main (void) 10 { 11 aw_pool_id_t pool_id; 12 pool_id = aw_pool_init(& g_pool, g_pool_mem, 1024, 16); 13 if (pool_id!= NULL) { // 14 aw_kprintf("init successful!\r\n" ); 15 } else { // 16 aw_kprintf("init Failed!\r\n"); 17 } 18 while(1) { 19 aw_mdelay(200); 20 } 21 } aw_pool_item_size () 3 size_t aw_pool_item_size (aw_pool_id_t pool_id); pool_id ID #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 237

251 4 #include "aw_pool.h" 5 6 static aw_pool_t g_pool; // 7 static uint8_t g_pool_mem[1024]; // 8 9 int aw_main (void) 10 { 11 aw_pool_id_t pool_id; 12 pool_id = aw_pool_init(& g_pool, g_pool_mem, 1024, 5); 13 if (pool_id!= NULL) { // 14 aw_kprintf("init successful! The actual item size is %d\r\n", aw_pool_item_size(pool_id)); 15 } else { // 16 aw_kprintf("init Failed!\r\n"); 17 } 18 while(1) { 19 aw_mdelay(200); 20 } 21 } #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_pool.h" 5 6 static aw_pool_t g_pool_small; // 7 static uint8_t g_pool_small_mem[512]; // 8 9 static aw_pool_t g_pool_mid; // 10 static uint8_t g_pool_mid_mem[1024]; // static aw_pool_t g_pool_big; // 13 static uint8_t g_pool_big_mem[2048]; // int aw_main (void) 16 { 17 aw_pool_id_t pool_id_small; 18 aw_pool_id_t pool_id_mid; 19 aw_pool_id_t pool_id_big;

252 21 pool_id_small = aw_pool_init(& g_pool_small, g_pool_small_mem, 512, 8); 22 pool_id_mid = aw_pool_init(& g_pool_mid, g_pool_mid_mem, 1024, 64); 23 pool_id_big = aw_pool_init(& g_pool_big, g_pool_big_mem, 2048, 128); // while(1) { 27 aw_mdelay(200); 28 } 29 } void *aw_pool_item_get (aw_pool_id_t pool_id); pool_id ID void * NULL int *ptr; 2 ptr = (int *) aw_pool_item_get(pool_id); // 3 if (ptr!= NULL) { // 4 ptr[0] = 5; // 5 ptr[1] = 6; 6 //... 7 } 5 aw_err_t aw_pool_item_return (aw_pool_id_t pool_id, void *p_item); pool_id ID p_item aw_pool_item_get() aw_pool_item_get() aw_err_t AW_OK aw_pool_item_get() aw_pool_item_return() #include "aworks.h" 2 #include "aw_delay.h" 239

253 3 #include "aw_vdebug.h" 4 #include "aw_pool.h" 5 6 static aw_pool_t g_pool; // 7 static uint8_t g_pool_mem[1024]; // 8 9 int aw_main (void) 10 { 11 aw_pool_id_t pool_id; 12 int *ptr; pool_id = aw_pool_init(& g_pool, g_pool_mem, 1024, sizeof(int) * 2); 15 if (pool_id!= NULL) { // 16 ptr = (int *) aw_pool_item_get(pool_id); // 17 if (ptr!= NULL) { // 18 ptr[0] = 5; // 19 ptr[1] = 6; 20 aw_kprintf("%d %d \r\n", ptr[0], ptr[1]); 21 aw_pool_item_return(pool_id, ptr); // 22 ptr = NULL; // NULL 23 } 24 } else { // 25 aw_kprintf("init Failed!\r\n"); 26 } 27 while(1) { 28 aw_mdelay(200); 29 } 30 } 240

254 10 AWorks OS AWorks AWorks FreeRTOS μc/os-iiμc/os-iiisysbios LinuxWindows Android AWorks ZLG RTK 1 1K RAM2K ROM 2 OS AWorks OS AMetal C AMetal main while(1) int am_main (void) 2 { 3 while(1) { 4 am_led_toggle(0); // LED0 5 am_led_toggle(1); // LED1 6 am_mdelay(500); // 500ms 7 } 8 } LED0 2 LED int am_main (void) 2 { 3 int i; 4 while(1) { 241

255 5 am_led_toggle(1); // LED1 6 for (i = 0; i < 2; i++) { // LED0 500ms 7 am_led_toggle(0); // LED0 8 am_mdelay(250); // 250ms 9 } 10 } 11 } LED1 500ms LED0 250ms LED LED AMetal LED LED LED LED while(1) while(1) LED LED LED 10.2 LED LED LED LED ms 10.2 LED LED 10.3 LED while(1) LED LED LED CPU while(1) while(1) CPU while(1)cpu 242

256 1 1 1 CPU CPUCPU while(1) CPU CPU CPU CPU CPU LED0 2 1s 4 LED LED 4 LED CPU CPU 1s CPU CPU CPU CPU CPU MCU AWorks MCU AMetal AWorks 1 AWorks aw_task.h AW_TASK_DECL(task, stack_size) AW_TASK_DECL_STATIC(task, stack_size) AW_TASK_DECL_STATIC() static () 243

257 task stack_size while(1) task_led0 512 AW_TASK_DECL() AW_TASK_DECL(task_led0, 512); AW_TASK_DECL() struct my_struct { 2 //... 3 AW_TASK_DECL(task_led0, 512); // task_led //... 5 }; AW_TASK_DECL_STATIC() AW_TASK_DECL_STATIC(task_led0, 512); AW_TASK_DECL_STATIC() AW_TASK_DECL() 2 AWorks AW_TASK_INIT(task, name, priority, stack_size, func, arg) task AW_TASK_DECL() AW_TASK_DECL_STATIC() name task_led0priority 0 stack_size func 1 void task_entry (void *p_arg) 2 { 3 while(1) { 4 //... 5 } 6 } p_arg arg arg NULL task_led

258 AW_TASK_DECL_STATIC(task_led0, 512); // 2 3 void task_led0_entry (void *p_arg) // 4 { 5 while(1) { 6 aw_led_toggle(0); 7 aw_mdelay(500); 8 } 9 } int aw_main() 12 { 13 AW_TASK_INIT( 14 task_led0, // 15 "task_led0", // 16 5, // , // 18 task_led0_entry, // 19 NULL); // 20 while(1) { 21 aw_mdelay(1000); 22 } 23 } AW_TASK_INIT() ID aw_task_id_t ID aw_task_id_t task_led0_id = AW_TASK_INIT(task_led0, "task_led0", 5, 512, task_led0_entry, NULL); aw_task_id_t ID ID NULL ID ID aw_task_lowest_priority() unsigned int aw_task_lowest_priority(void); 3 AWorks AW_TASK_STARTUP(task) task AW_TASK_DECL() AW_TASK_DECL_STATIC() task_led

259 #include "aworks.h" 2 #include "aw_led.h" 3 #include "aw_delay.h" 4 #include "aw_task.h" 5 6 AW_TASK_DECL_STATIC(task_led0, 512); // 7 8 static void task_led0_entry (void *p_arg) // 9 { 10 while(1) { 11 aw_led_toggle(0); 12 aw_mdelay(250); 13 } 14 } int aw_main() 17 { 18 AW_TASK_INIT( 19 task_led0, // 20 "task_led0", // 21 5, // , // 23 task_led0_entry, // 24 NULL); // 25 AW_TASK_STARTUP(task_led0); // 26 while(1) { 27 aw_mdelay(1000); 28 } 29 } task_led0 static task_led0_entry() task_led0 aw_main() CPUCPU CPU CPU CPU aw_main() LED1 LED task_led1 1 #include "aworks.h" 2 #include "aw_led.h" 3 #include "aw_delay.h" 246

260 4 #include "aw_task.h" 5 6 AW_TASK_DECL_STATIC(task_led0, 512); // 7 AW_TASK_DECL_STATIC(task_led1, 512); // 8 9 static void task_led0_entry (void *p_arg) // 10 { 11 while(1) { 12 aw_led_toggle(0); 13 aw_mdelay(250); 14 } 15 } static void task_led1_entry (void *p_arg) // 18 { 19 while(1) { 20 aw_led_toggle(1); 21 aw_mdelay(500); 22 } 23 } int aw_main() 26 { 27 AW_TASK_INIT( 28 task_led0, // 29 "task_led0", // 30 5, // , // 32 task_led0_entry, // 33 NULL); // 34 AW_TASK_INIT( 35 task_led1, // 36 "task_led1", // 37 6, // , // 39 task_led1_entry, // 40 NULL); // 41 AW_TASK_STARTUP(task_led0); // 42 AW_TASK_STARTUP(task_led1); // 43 while(1) { 44 aw_mdelay(1000); 45 } 46 } aw_main() 247

261 task_led0 task_led #include "aworks.h" 2 #include "aw_led.h" 3 #include "aw_delay.h" 4 #include "aw_task.h" 5 6 AW_TASK_DECL_STATIC(task_led0, 512); // 7 AW_TASK_DECL_STATIC(task_led1, 512); // 8 9 static void task_led1_entry (void *p_arg) // 10 { 11 while(1) { 12 aw_led_toggle(1); 13 aw_mdelay(500); 14 } 15 } static void task_led0_entry (void *p_arg) // 18 { 19 AW_TASK_INIT( 20 task_led1, // 21 "task_led1", // 22 6, // , // 24 task_led1_entry, // 25 NULL); // 26 AW_TASK_STARTUP(task_led1); // 27 while(1) { 28 aw_led_toggle(0); 29 aw_mdelay(250); 30 } 31 } int aw_main() 34 { 35 AW_TASK_INIT( 36 task_led0, // 37 "task_led0", // 38 5, // , // 40 task_led0_entry, // 41 NULL); // 248

262 42 AW_TASK_STARTUP(task_led0); // 43 while(1) { 44 aw_mdelay(1000); 45 } 46 } while(1) AWorks CPU AW_TASK_TERMINATE(task) task AW_TASK_DECL() AW_TASK_DECL_STATIC() LED0 10s task_led0 10s #include "aworks.h" 2 #include "aw_led.h" 3 #include "aw_delay.h" 4 #include "aw_task.h" 5 6 AW_TASK_DECL_STATIC(task_led0, 512); // 7 8 static void task_led0_entry (void *p_arg) // 9 { 10 while(1) { 11 aw_led_toggle(0); 12 aw_mdelay(250); 13 } 14 } int aw_main() 17 { 18 AW_TASK_INIT( 19 task_led0, // 20 "task_led0", // 21 5, // , // 23 task_led0_entry, // 24 NULL); // 25 AW_TASK_STARTUP(task_led0); // 26 aw_mdelay(10000); // 10s task_led0 249

263 27 AW_TASK_TERMINATE(task_led0); // 28 while(1) { 29 aw_mdelay(1000); 30 } 31 } void aw_task_delay(int ticks); ticks CPU CPU ticks 500ms aw_task_delay(aw_ms_to_ticks(500)); 500ms aw_mdelay() CPU CPU 10.7 LED aw_mdelay() aw_task_delay() #include "aworks.h" 2 #include "aw_led.h" 3 4 #include "aw_task.h" 5 6 AW_TASK_DECL_STATIC(task_led0, 512); // 7 8 static void task_led0_entry (void *p_arg) // 9 { 10 while(1) { 11 aw_led_toggle(0); 12 aw_task_delay(aw_ms_to_ticks(250)); // 250ms 13 } 14 } int aw_main() 17 { 18 AW_TASK_INIT( 19 task_led0, // 20 "task_led0", // 250

264 21 5, // , // 23 task_led0_entry, // 24 NULL); // 25 AW_TASK_STARTUP(task_led0); // 26 while(1) { 27 aw_task_delay(aw_ms_to_ticks(1000)); // 1s 28 } 29 } AW_TASK_DECL() AW_TASK_DECL_STATIC() stack_size AWorks aw_task.h AW_TASK_STACK_CHECK (task,p_total,p_free) AW_TASK_STACK_CHECK_SELF(p_total,p_free) 1 AW_TASK_STACK_CHECK() AW_TASK_STACK_CHECK (task,p_total,p_free) task AW_TASK_DECL() AW_TASK_DECL_STATIC() p_total unsigned int p_free unsigned int 1s task_led #include "aworks.h" 2 #include "aw_led.h" 3 #include "aw_delay.h" 4 #include "aw_task.h" 5 #include "aw_vdebug.h" 6 7 AW_TASK_DECL_STATIC(task_led0, 512); // 8 9 static void task0_led_entry (void *p_arg) // 10 { 251

265 11 while(1) { 12 aw_led_toggle(0); 13 aw_mdelay(250); 14 } 15 } int aw_main() 18 { 19 unsigned int total, free; AW_TASK_INIT( 22 task_led0, // 23 "task_led0", // 24 5, // , // 26 task0_led_entry, // 27 NULL); // 28 AW_TASK_STARTUP(task_led0); // 29 while(1) { 30 aw_mdelay(1000); 31 AW_TASK_STACK_CHECK(task_led0, &total, &free); 32 aw_kprintf("total: %d, free: %d, used: %d \r\n", total, free, total - free); 33 } 34 } aw_kprintf() int aw_kprintf (const char *fmt,...); aw_vdebug.h C printf()aw_kprintf() Total: 512, free: 376, used: 136 task_led % 50% ~ 80% task_led task_led0 256 task_led0 LED 256 LED1 task_led1 252

266 2 AW_TASK_STACK_CHECK_SELF() AW_TASK_STACK_CHECK_SELF(p_total,p_free) task unsigned int p_total p_free task_led #include "aworks.h" 2 #include "aw_led.h" 3 #include "aw_delay.h" 4 #include "aw_task.h" 5 #include "aw_vdebug.h" 6 7 AW_TASK_DECL_STATIC(task_led0, 512); // 8 9 static void task0_led_entry (void *p_arg) // 10 { 11 unsigned int total, free; 12 while(1) { 13 aw_led_toggle(0); 14 aw_mdelay(250); 15 AW_TASK_STACK_CHECK_SELF(&total, &free); 16 aw_kprintf("total: %d, free: %d, used: %d \r\n", total, free, total - free); 17 } 18 } int aw_main() 21 { 22 AW_TASK_INIT( 23 task_led0, // 24 "task_led0", // 25 5, // , // 27 task0_led_entry, // 28 NULL); // 29 AW_TASK_STARTUP(task_led0); // 30 while(1) { 31 aw_mdelay(1000); 32 } 33 } 253

267 Total: 512, free: 268, used: 244 task_led % AW_TASK_STACK_CHECK() AW_TASK_STACK_CHECK() 10.2 AWorks mutex aw_kprintf() #include "aworks.h" 2 #include "aw_led.h" 3 #include "aw_delay.h" 4 #include "aw_task.h" 5 #include "aw_vdebug.h" 6 7 AW_TASK_DECL_STATIC(task0, 512); // task0 8 AW_TASK_DECL_STATIC(task1, 512); // task static void task0_entry (void *p_arg) // task0 11 { 12 int i; 13 for (i = 0; i < 5; i++) { 14 aw_kprintf("task0: \r\n"); 15 aw_mdelay(1); 16 } 17 while(1) { 18 aw_mdelay(1000); 19 } 20 } static void task1_entry (void *p_arg) // task1 254

268 23 { 24 int i; 25 for (i = 0; i < 5; i++) { 26 aw_kprintf("task1: ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n"); 27 aw_mdelay(1); 28 } 29 while(1) { 30 aw_mdelay(1000); 31 } 32 } int aw_main() 35 { 36 AW_TASK_INIT( 37 task0, // 38 "task0", // 39 5, // , // 41 task0_entry, // 42 NULL); // 43 AW_TASK_INIT( 44 task1, // 45 "task1", // 46 6, // , // 48 task1_entry, // 49 NULL); // 50 AW_TASK_STARTUP(task0); // task0 51 AW_TASK_STARTUP(task1); // task1 52 while(1) { 53 aw_mdelay(1000); 54 } 55 } task0 1ms Task0: task1 1ms Task1: ABCDEFGHIJKLMNOPQRSTUVWXYZ Task0: TaskTask0: : Task0: ABCTask0: DEFTask0: GHIJKLMNOPQRSTUVWXYZ Task1: ABCDEFGHIJKLMNOPQRSTUVWXYZ Task1: ABCDEFGHIJKLMNOPQRSTUVWXYZ Task1: ABCDEFGHIJKLMNOPQRSTUVWXYZ 255

269 Task1: ABCDEFGHIJKLMNOPQRSTUVWXYZ task0 task1 task1 task0 task1 task1 5 Task1ABC DEFGHIJKLMNOPQRSTUVWXYZTask1 4 task0 task1 4 AWorks aw_sem.h AW_MUTEX_DECL(sem) AW_MUTEX_DECL_STATIC(sem) AW_MUTEX_INIT(sem, options) AW_MUTEX_LOCK(sem, timeout) AW_MUTEX_UNLOCK(sem) AW_MUTEX_TERMINATE(sem) 1 AW_MUTEX_DECL() AW_MUTEX_DECL_STATIC() AW_MUTEX_DECL(sem) AW_MUTEX_DECL_STATIC(sem) sem AW_MUTEX_DECL_STATIC(), static, AW_MUTEX_DECL() mutex_test AW_MUTEX_DECL (mutex_test); AW_MUTEX_DECL() struct my_struct { 2 //... 3 AW_MUTEX_DECL(mutex_test); // 4 //... 5 }; 256

270 AW_MUTEX_DECL_STATIC() mutex_test AW_MUTEX_DECL_STATIC (mutex_test); 2 AW_MUTEX_INIT() AW_MUTEX_INIT(sem, options) sem AW_MUTEX_DECL() AW_MUTEX_DECL_STATIC() options aw_sem.h AW_SEM_Q_FIFO AW_SEM_Q_PRIORITY FIFO AW_MUTEX_INIT (mutex_test, AW_SEM_Q_PRIORITY); AW_MUTEX_INIT() ID aw_mutex_id_t ID aw_mutex_id_t mutex_id = AW_MUTEX_INIT(mutex_test, AW_SEM_Q_PRIORITY) ; aw_mutex_id_t ID ID NULL ID ID 3 AW_MUTEX_LOCK(sem, timeout) sem AW_MUTEX_DECL() AW_MUTEX_DECL_STATIC() timeout aw_err_t AW_MUTEX_LOCK()AW_OK timeout 1 timeout AW_SEM_WAIT_FOREVER 257

271 AW_MUTEX_UNLOCK() AW_MUTEX_LOCK(mutex_test, AW_SEM_WAIT_FOREVER); 2 timeout AW_SEM_NO_WAIT AW_MUTEX_LOCK()-AW_EAGAIN AW_MUTEX_LOCK(mutex_test, AW_SEM_NO_WAIT); 3 timeout timeout AW_MUTEX_LOCK()AW_OK timeout -AW_ETIME ms 1 AW_MUTEX_LOCK(mutex_test, aw_ms_to_ticks(500)); AW_MUTEX_LOCK() AW_OK AW_EAGAIN AW_ETIME aw_errno.h 4 AW_MUTEX_LOCK() AW_MUTEX_UNLOCK(sem) sem AW_MUTEX_DECL() AW_MUTEX_DECL_STATIC() aw_err_t AW_MUTEX_UNLOCK (mutex_test); 5 AW_MUTEX_TERMINATE(sem) sem AW_MUTEX_DECL() AW_MUTEX_DECL_STATIC(), -AW_ENXIO AW_MUTEX_TERMINATE(mutex_test); 258

272 #include "aworks.h" 2 #include "aw_led.h" 3 #include "aw_delay.h" 4 #include "aw_task.h" 5 #include "aw_vdebug.h" 6 7 AW_TASK_DECL_STATIC(task0, 512); // task0 8 AW_TASK_DECL_STATIC(task1, 512); // task1 9 AW_MUTEX_DECL_STATIC(mutex_test); // static void task0_entry (void *p_arg) // task0 12 { 13 int i; 14 for (i = 0; i < 5; i++) { 15 // 16 AW_MUTEX_LOCK(mutex_test, AW_SEM_WAIT_FOREVER); 17 aw_kprintf("task0: \r\n"); 18 AW_MUTEX_UNLOCK(mutex_test); // 19 aw_mdelay(1); 20 } 21 while(1) { 22 aw_mdelay(1000); 23 } 24 } static void task1_entry (void *p_arg) // task1 27 { 28 int i; 29 for (i = 0; i < 5; i++) { 30 // 31 AW_MUTEX_LOCK(mutex_test, AW_SEM_WAIT_FOREVER); 32 aw_kprintf("task1: ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n"); 33 AW_MUTEX_UNLOCK(mutex_test); // 34 aw_mdelay(1); 35 } 36 while(1) { 37 aw_mdelay(1000); 38 } 39 }

273 41 int aw_main() 42 { 43 AW_MUTEX_INIT(mutex_test, AW_SEM_Q_PRIORITY); // 44 AW_TASK_INIT( 45 task0, // 46 "task0", // 47 5, // , // 49 task0_entry, // 50 NULL); // 51 AW_TASK_INIT( 52 task1, // 53 "task1", // 54 6, // , // 56 task1_entry, // 57 NULL); // 58 AW_TASK_STARTUP(task0); // task0 59 AW_TASK_STARTUP(task1); // task1 60 while(1) { 61 aw_mdelay(1000); 62 } 63 } Task0: Task1: ABCDEFGHIJKLMNOPQRSTUVWXYZ Task0: Task0: Task1: ABCDEFGHIJKLMNOPQRSTUVWXYZ Task0: Task0: Task1: ABCDEFGHIJKLMNOPQRSTUVWXYZ Task1: ABCDEFGHIJKLMNOPQRSTUVWXYZ Task1: ABCDEFGHIJKLMNOPQRSTUVWXYZ AW_MUTEX_LOCK() AW_MUTEX_LOCK() AW_MUTEX_UNLOCK() task0 task

274 static void printf_test_data (int data) 2 { 3 AW_MUTEX_LOCK(mutex_test, AW_SEM_WAIT_FOREVER); 4 aw_kprintf("the test data is %d\r\n", data); 5 AW_MUTEX_UNLOCK(mutex_test); 6 } 7 8 static void task0_entry (void *p_arg) // task0 9 { 10 int i; 11 for (i = 0; i < 5; i++) { 12 // 13 AW_MUTEX_LOCK(mutex_test, AW_SEM_WAIT_FOREVER); 14 aw_kprintf("task0: \r\n"); 15 printf_test_data(123456); 15 AW_MUTEX_UNLOCK(mutex_test); // 16 aw_mdelay(1); 17 } 18 while(1) { 19 aw_mdelay(1000); 20 } 21 } task0 AW_MUTEX_LOCK() aw_kprintf() printf_test_data() AW_MUTEX_LOCK() task0 AW_MUTEX_LOCK() AW_OK AWorks

275 10.5 aw_sem.h AW_SEMB_DECL(sem) AW_SEMB_DECL_STATIC(sem) AW_SEMB_INIT(sem, initial_state, options) AW_SEMB_TAKE(sem, timeout) AW_SEMB_GIVE(sem) AW_SEMB_TERMINATE(sem) 1 AW_SEMB_DECL() AW_SEMB_DECL_STATIC() AW_SEMB_DECL(sem) AW_SEMB_DECL_STATIC(sem) sem AW_SEMB_DECL_STATIC(), static,, AW_SEMB_DECL() semb_test AW_SEMB_DECL (semb_test); AW_SEMB_DECL() struct my_struct { 2 //... 3 AW_SEMB_DECL(semb_test); // 4 //... 5 }; AW_SEMB_DECL_STATIC() semb_test AW_SEMB_DECL_STATIC (semb_test); 2 AW_SEMB_INIT() AW_SEMB_INIT(sem, initial_state, options) sem AW_SEMB_DECL() AW_SEMB_DECL_STATIC() 262

276 initial_state 1 AW_SEM_FULL 0 AW_SEM_EMPTYoptions AW_SEM_Q_PRIORITYAW_SEM_Q_FIFO AW_SEMB_INIT (semb_test, AW_SEM_EMPTY, AW_SEM_Q_PRIORITY); AW_SEMB_INIT() ID aw_semb_id_t ID aw_semb_id_t semb_id = AW_SEMB_INIT(semb_test, AW_SEM_EMPTY, AW_SEM_Q_PRIORITY) ; aw_semb_id_t ID ID NULL ID ID initial_state initial_state 3 AW_SEMB_TAKE(sem, timeout) sem AW_SEMB_DECL() AW_SEMB_DECL_STATIC() timeout aw_err_t AW_SEMB_TAKE() AW_OK timeout 1 timeout AW_SEM_WAIT_FOREVER AW_SEMB_TAKE(semb_test, AW_SEM_WAIT_FOREVER); 2 timeout AW_SEM_NO_WAIT AW_SEMB_TAKE()-AW_EAGAIN AW_SEMB_TAKE(semb_test, AW_SEM_NO_WAIT); 3 timeout timeout 263

277 AW_SEMB_TAKE()AW_OK timeout -AW_ETIME ms 1 AW_SEMB_TAKE(semb_test, aw_ms_to_ticks(500)); 4 AW_SEMB_GIVE(sem) sem AW_SEMB_DECL() AW_SEMB_DECL_STATIC() aw_err_t AW_SEMB_GIVE (semb_test); 5 AW_SEMB_TERMINATE(sem) sem AW_SEMB_DECL() AW_SEMB_DECL_STATIC(), -AW_ENXIO AW_SEMB_TERMINATE(semb_test); LED0 500ms 500ms LED #include "aworks.h" 2 #include "aw_led.h" 3 #include "aw_delay.h" 4 #include "aw_task.h" 5 #include "aw_sem.h" 6 #include "aw_input.h" 7 8 AW_TASK_DECL_STATIC(task_led0, 512); // task_led0 9 AW_SEMB_DECL_STATIC(semb_test); // static void task_led0_entry (void *p_arg) // task_led0 12 { 264

278 13 aw_err_t err; 14 while(1) { 15 err = AW_SEMB_TAKE(semb_test, AW_SEM_WAIT_FOREVER); 16 if (err == AW_OK) { 17 aw_led_on(0); 18 aw_mdelay(500); 19 aw_led_off(0); 20 aw_mdelay(500); 21 } 22 } 23 } static void key_process (aw_input_event_t *p_input_data, void *p_usr_data) 26 { 27 if (p_input_data->ev_type == AW_INPUT_EV_KEY) { // 28 aw_input_key_data_t *p_data = (aw_input_key_data_t *)p_input_data; 29 if (p_data->key_state!= 0) { // 30 AW_SEMB_GIVE(semb_test); 31 } 32 } 33 } int aw_main() 36 { 37 static aw_input_handler_t key_handler; // 40 AW_SEMB_INIT(semb_test, AW_SEM_EMPTY, AW_SEM_Q_PRIORITY); 41 AW_TASK_INIT( 42 task_led0, // 43 "task_led0", // 44 5, // , // 46 task_led0_entry, // 47 NULL); // 48 AW_TASK_STARTUP(task_led0); // task_led0 49 aw_input_handler_register(&key_handler, key_process, NULL); 50 while(1) { 51 aw_mdelay(1000); 52 } 53 } task_led0 LED 500ms 500ms LED 1s 265

279 1s 1s LED LED LED task_led0 LED LED 1s 2 LED LED task_led0 LED LED LED LED 1s LED LED #include "aworks.h" 2 #include "aw_led.h" 3 #include "aw_delay.h" 4 #include "aw_task.h" 5 #include "aw_vdebug.h" 6 7 AW_TASK_DECL_STATIC(task0, 512); // task0 8 AW_TASK_DECL_STATIC(task1, 512); // task1 9 AW_SEMB_DECL_STATIC(semb_test); // static void task0_entry (void *p_arg) // task0 12 { 13 int i; 14 for (i = 0; i < 5; i++) { 15 // 16 AW_SEMB_TAKE(semb_test, AW_SEM_WAIT_FOREVER); 17 aw_kprintf("task0: \r\n"); 18 AW_SEMB_GIVE(semb_test); // 19 aw_mdelay(1); 20 } 21 while(1) { 22 aw_mdelay(1000); 23 } 266

280 24 } static void task1_entry (void *p_arg) // task1 27 { 28 int i; 29 for (i = 0; i < 5; i++) { 30 // 31 AW_SEMB_TAKE(semb_test, AW_SEM_WAIT_FOREVER); 32 aw_kprintf("task1: ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n"); 33 AW_SEMB_GIVE(semb_test); // 34 aw_mdelay(1); 35 } 36 while(1) { 37 aw_mdelay(1000); 38 } 39 } int aw_main() 42 { 43 // 44 AW_SEMB_INIT(semb_test, AW_SEM_FULL, AW_SEM_Q_PRIORITY); 45 AW_TASK_INIT( 46 task0, // 47 "task0", // 48 5, // , // 50 task0_entry, // 51 NULL); // 52 AW_TASK_INIT( 53 task1, // 54 "task1", // 55 6, // , // 57 task1_entry, // 58 NULL); // 59 AW_TASK_STARTUP(task0); // task0 60 AW_TASK_STARTUP(task1); // task1 61 while(1) { 62 aw_mdelay(1000); 63 } 64 } AW_SEM_FULL 267

281 10.26 task static void printf_test_data (int data) 2 { 3 AW_SEMB_TAKE(semb_test, AW_SEM_WAIT_FOREVER); 4 aw_kprintf("the test data is %d\r\n", data); 5 AW_SEMB_GIVE(semb_test); 6 } 7 8 static void task0_entry (void *p_arg) // task0 9 { 10 int i; 11 for (i = 0; i < 5; i++) { 12 // 13 AW_SEMB_TAKE(semb_test, AW_SEM_WAIT_FOREVER); 14 aw_kprintf("task0: \r\n"); 15 printf_test_data(123456); 16 AW_SEMB_GIVE(semb_test) ; // 17 aw_mdelay(1); 18 } 19 while(1) { 20 aw_mdelay(1000); 21 } 22 } Task0: task0 AW_SEMB_TAKE() aw_kprintf() printf_test_data() AW_SEMB_TAKE() task0 task0 task AWorks

282 AWorks aw_sem.h AW_SEMC_DECL(sem) AW_SEMC_DECL_STATIC(sem) AW_SEMC_INIT(sem, initial_count, options) AW_SEMC_TAKE(sem, timeout) AW_SEMC_GIVE(sem) AW_SEMC_TERMINATE(sem) 1 AW_SEMC_DECL() AW_SEMC_DECL_STATIC() AW_SEMC_DECL(sem) AW_SEMC_DECL_STATIC(sem) sem AW_SEMC_DECL_STATIC(), static,, AW_SEMC_DECL() semc_test AW_SEMC_DECL (semc_test); AW_SEMC_DECL() struct my_struct { 2 //... 3 AW_SEMC_DECL(semc_test); // 4 //... 5 }; AW_SEMC_DECL_STATIC() semc_test AW_SEMC_DECL_STATIC (semc_test); 269

283 2 AW_SEMC_INIT() AW_SEMC_INIT(sem, initial_count, options) sem AW_SEMC_DECL() AW_SEMC_DECL_STATIC() initial_count 0options AW_SEM_Q_PRIORITY AW_SEM_Q_FIFO AW_SEMC_INIT (semc_test, 0, AW_SEM_Q_PRIORITY); AW_SEMC_INIT() ID aw_semc_id_t ID aw_semc_id_t semc_id = AW_SEMC_INIT(semc_test, 0, AW_SEM_Q_PRIORITY) ; aw_semc_id_t ID ID NULL ID ID 3 AW_SEMC_TAKE(sem, timeout) sem AW_SEMC_DECL() AW_SEMC_DECL_STATIC() timeout aw_err_t 0 1AW_SEMC_TAKE()AW_OK 0 timeout 1 timeout AW_SEM_WAIT_FOREVER AW_SEMC_TAKE(semc_test, AW_SEMC_WAIT_FOREVER); 2 timeout AW_SEM_NO_WAIT AW_SEMC_TAKE()-AW_EAGAIN AW_SEMC_TAKE(semc_test, AW_SEM_NO_WAIT); 3 timeout timeout 270

284 AW_SEMC_TAKE()AW_OK timeout -AW_ETIME ms 1 AW_SEMC_TAKE(semc_test, aw_ms_to_ticks(500)); 4 AW_SEMC_GIVE(sem) sem AW_SEMC_DECL() AW_SEMC_DECL_STATIC() aw_err_t AW_SEMC_GIVE (semc_test); 5 AW_SEMC_TERMINATE(sem) sem AW_SEMC_DECL() AW_SEMC_DECL_STATIC(), -AW_ENXIO AW_SEMC_TERMINATE(semc_test); s #include "aworks.h" 2 #include "aw_led.h" 3 #include "aw_delay.h" 4 #include "aw_task.h" 5 #include "aw_sem.h" 6 #include "aw_input.h" 7 8 AW_TASK_DECL_STATIC(task_led0, 512); // task_led0 9 AW_SEMC_DECL_STATIC(semc_test); // static void task_led0_entry (void *p_arg) // task_led0 12 { 13 aw_err_t err; 14 while(1) { 15 err = AW_SEMC_TAKE(semc_test, AW_SEM_WAIT_FOREVER); 271

285 16 if (err == AW_OK) { 17 aw_led_on(0); 18 aw_mdelay(500); 19 aw_led_off(0); 20 aw_mdelay(500); 21 } 22 } 23 } static void key_process (aw_input_event_t *p_input_data, void *p_usr_data) 26 { 27 if (p_input_data->ev_type == AW_INPUT_EV_KEY) { // 28 aw_input_key_data_t *p_data = (aw_input_key_data_t *)p_input_data; 29 if (p_data->key_state!= 0) { // 30 AW_SEMC_GIVE(semb_test); 31 } 32 } 33 } int aw_main() 36 { 37 static aw_input_handler_t key_handler; // 40 AW_SEMC_INIT(semc_test, AW_SEM_EMPTY, AW_SEM_Q_PRIORITY); 41 AW_TASK_INIT( 42 task_led0, // 43 "task_led0", // 44 5, // , // 46 task_led0_entry, // 47 NULL); // 48 AW_TASK_STARTUP(task_led0); // task_led0 49 aw_input_handler_register(&key_handler, key_process, NULL); 50 while(1) { 51 aw_mdelay(1000); 52 } 53 } SEMBSEMC task_led0 LED 500ms 500ms 1s LED 272

286 10.3 AWorks FIFO 4 4 AWorks aw_mailbox.h AW_MAILBOX_DECL(mailbox, mail_num) AW_MAILBOX_DECL_STATIC(mailbox, mail_num) AW_MAILBOX_INIT(mailbox, mail_num, options) AW_MAILBOX_RECV(mailbox, p_data, timeout) AW_MAILBOX_SEND(mailbox, data, timeout, priority) AW_MAILBOX_TERMINATE(mailbox) 1 AW_MAILBOX_DECL() AW_MAILBOX_DECL_STATIC() AW_MAILBOX_DECL(mailbox, mail_num) AW_MAILBOX_DECL_STATIC(mailbox, mail_num) mailbox mail_num 4 mail_num4 AW_MAILBOX_DECL_STATIC(), static, 273

287 AW_MAILBOX_DECL() mailbox_test AW_MAILBOX_DECL (mailbox_test, 10); AW_MAILBOX_DECL() struct my_struct { 2 //... 3 AW_MAILBOX_DECL(mailbox_test, 10); // 4 }; AW_MAILBOX_DECL_STATIC() mailbox_test AW_MAILBOX_DECL_STATIC (mailbox_test, 10); 2 AW_MAILBOX_INIT() AW_MAILBOX_INIT(mailbox, mail_num, options) mailbox AW_MAILBOX_DECL() AW_MAILBOX_DECL_STATIC() mail_num mail_num options aw_mailbox.h AW_MAILBOX_Q_FIFO AW_MAILBOX_Q_PRIORITY FIFO AW_SEM_Q_PRIORITY AW_SEM_Q_FIFO AW_MAILBOX_INIT (mailbox_test, 10, AW_MAILBOX_Q_PRIORITY); AW_MAILBOX_INIT() ID aw_mailbox_id_t ID 1 aw_mailbox_id_t mailbox_id = AW_MAILBOX_INIT(mailbox_test,10,AW_MAILBOX_Q_PRIORITY); 274

288 aw_mailbox_id_t ID ID NULL ID ID 3 AW_MAILBOX_RECV(mailbox, p_data, timeout) mailbox AW_MAILBOX_DECL() AW_MAILBOX_DECL_STATIC() p_data p_data timeout aw_err_t 1AW_MAILBOX_RECV() AW_OK timeout 1 timeout AW_MAILBOX_WAIT_FOREVER uint32_t data; 2 AW_MAILBOX_RECV(mailbox_test, &data, AW_MAILBOX_WAIT_FOREVER); 2 timeout AW_MAILBOX_NO_WAIT AW_MAILBOX_RECV()-AW_EAGAIN uint32_t data; 2 AW_MAILBOX_RECV(mailbox_test, &data, AW_MAILBOX_NO_WAIT); 3 timeout timeout AW_MAILBOX_RECV() AW_OK timeout -AW_ETIME ms 1 uint32_t data; 2 AW_MAILBOX_RECV(mailbox_test, &data, aw_ms_to_ticks(500)); 4 AW_MAILBOX_SEND(mailbox, data, timeout, priority) mailbox AW_MAILBOX_DECL() AW_MAILBOX_DECL_STATIC() data 32 timeout priority aw_err_t 275

289 1 AW_MAILBOX_SEND()AW_OK timeout 1 timeout AW_MAILBOX_WAIT_FOREVER uint32_t data = 5; 2 AW_MAILBOX_SEND( 3 mailbox_test, 4 data, 5 AW_MAILBOX_WAIT_FOREVER, 6 AW_MAILBOX_PRI_NORMAL); priority AW_MAILBOX_PRI_NORMAL AW_MAILBOX_PRI_URGENT 2 timeout AW_MAILBOX_NO_WAIT AW_MAILBOX_SEND()-AW_EAGAIN uint32_t data = 5; 2 AW_MAILBOX_SEND( 3 mailbox_test, 4 data, 5 AW_MAILBOX_NO_WAIT, 6 AW_MAILBOX_PRI_NORMAL); 3 timeout timeout AW_MAILBOX_SEND() AW_OK timeout -AW_ETIME ms 1 uint32_t data = 5; 2 AW_MAILBOX_SEND( 3 mailbox_test, 4 data, 5 aw_ms_to_ticks(500), 6 AW_MAILBOX_PRI_NORMAL); 276

290 timeout AW_MAILBOX_NO_WAIT 5 AW_MAILBOX_TERMINATE(mailbox) mailbox AW_MAILBOX_DECL() AW_MAILBOX_DECL_STATIC(), -AW_ENXIO AW_MAILBOX_TERMINATE(mailbox_test); LED LED LED KEY_0 LED0 LED1 00 KEY_1 LED0 LED1 01 KEY_2 LED0 LED1 02 KEY_3 LED0 LED1 03 int #include "aworks.h" 2 #include "aw_led.h" 3 #include "aw_delay.h" 4 #include "aw_task.h" 5 #include "aw_mailbox.h" 6 #include "aw_input.h" 7 8 AW_TASK_DECL_STATIC(task_led, 512); // 9 AW_MAILBOX_DECL_STATIC(mailbox_test, 10); // static void task_led_entry (void *p_arg) // task_led 12 { 13 int key_code; 277

291 14 aw_err_t err; 15 while(1) { 16 err = AW_MAILBOX_RECV(mailbox_test, &key_code, AW_MAILBOX_WAIT_FOREVER); 17 if (err == AW_OK) { 18 switch (key_code) { 19 case KEY_0: aw_led_off(0); aw_led_off(1); break; 20 case KEY_1: aw_led_off(0); aw_led_on(1); break; 21 case KEY_2: aw_led_on(0); aw_led_off(1); break; 22 case KEY_3: aw_led_on(0); aw_led_on(1); break; 23 default :break; 24 } 25 } 26 } 27 } static void key_process (aw_input_event_t *p_input_data, void *p_usr_data) 30 { 31 if (p_input_data->ev_type == AW_INPUT_EV_KEY) { // 32 aw_input_key_data_t *p_data = (aw_input_key_data_t *)p_input_data; 33 if (p_data->key_state!= 0) { // 34 AW_MAILBOX_SEND( 35 mailbox_test, 36 p_data->key_code, 37 AW_MAILBOX_NO_WAIT, 38 AW_MAILBOX_PRI_NORMAL); 39 } 40 } 41 } int aw_main() 44 { 45 static aw_input_handler_t key_handler; AW_MAILBOX_INIT(mailbox_test, 10, AW_MAILBOX_Q_PRIORITY); 48 AW_TASK_INIT( 49 task_led, // 50 "task_led", // 51 5, // , // 53 task_led_entry, // 54 NULL); // 55 AW_TASK_STARTUP(task_led); // task_led0 56 aw_input_handler_register(&key_handler, key_process, NULL); 57 while(1) { 278

292 58 aw_mdelay(1000); 59 } 60 } key_state 0 task_led LED LED PC #include "aworks.h" 2 #include "aw_mailbox.h" 3 #include "aw_delay.h" 4 #include "aw_task.h" 5 #include "aw_vdebug.h" 6 7 AW_TASK_DECL_STATIC(task0, 512); 8 AW_TASK_DECL_STATIC(task1, 512); 9 10 AW_MAILBOX_DECL_STATIC(mailbox_test, 10); // aw_local char g_str1[] = "The count is an odd number!"; 13 aw_local char g_str2[] = "The count is an even number!"; // 16 aw_local void task0_entry (void *p_arg) 17 { 18 uint32_t count = 0; 19 aw_err_t ret = AW_OK; 20 while (1) { 21 count++; 22 if (count & 0x01) { 23 ret = AW_MAILBOX_SEND( 279

293 24 mailbox_test, 25 (uint32_t) g_str1, 26 AW_MAILBOX_WAIT_FOREVER, 27 AW_MAILBOX_PRI_NORMAL); 28 } else { 29 ret = AW_MAILBOX_SEND( 30 mailbox_test, 31 (uint32_t) g_str2, 32 AW_MAILBOX_WAIT_FOREVER, 33 AW_MAILBOX_PRI_NORMAL); 34 } 35 if (AW_OK == ret) { 36 aw_kprintf("task0 send a mail.\n"); 37 } 38 aw_mdelay(1000); 39 } 40 } // 43 aw_local void task1_entry (void *p_arg) 44 { 45 unsigned char *p_str; 46 while (1) { 47 if (AW_MAILBOX_RECV(mailbox_test, 48 &p_str, 49 AW_MAILBOX_WAIT_FOREVER) == AW_OK) { aw_kprintf("task1 recv a mail,the content is : %s\n", p_str); 52 } 53 aw_mdelay(10); 54 } 55 } int aw_main (void) 58 { 59 // 60 AW_MAILBOX_INIT(mailbox_test, 10, AW_MAILBOX_Q_PRIORITY); // task0 63 AW_TASK_INIT( 64 task0, // 65 "task0", // 66 1, // , // 280

294 68 task0_entry, // 69 NULL); // 70 // task0 71 AW_TASK_STARTUP(task0); // task1 74 AW_TASK_INIT( 75 task1, // 76 "task1", // 77 2, // , // 79 task1_entry, // 80 NULL); // 81 // task1 82 AW_TASK_STARTUP(task1); 83 return 0; 84 } task0 task1task0 1s count 1 count g_str1 count g_str2 g_str1 g_str2 The count is an odd number!the count is an even number! 4 4 tsak1 task1 aw_kprintf() LED LED #include "aworks.h" 2 #include "aw_led.h" 3 #include "aw_delay.h" 4 #include "aw_task.h" 5 #include "aw_mailbox.h" 6 #include "aw_input.h" 281

295 7 #include "aw_mem.h" 8 9 AW_TASK_DECL_STATIC(task_led, 512); // 10 AW_MAILBOX_DECL_STATIC(mailbox_test, 10); // // 13 typedef struct { 14 int key_code; 15 int key_state; 16 } mail_key_info_t; static void task_led_entry (void *p_arg) // 19 { 20 aw_err_t err; 21 mail_key_info_t *p_info; while(1) { 24 err = AW_MAILBOX_RECV(mailbox_test, &p_info, AW_MAILBOX_WAIT_FOREVER); 25 if (err == AW_OK) { 26 if (p_info->key_state!= 0) { 27 switch (p_info->key_code){ 28 case KEY_0: aw_led_off(0); aw_led_off(1); break; 29 case KEY_1: aw_led_off(0); aw_led_on(1); break; 30 case KEY_2: aw_led_on(0); aw_led_off(1); break; 31 case KEY_3: aw_led_on(0); aw_led_on(1); break; 32 default :break; 33 } 34 } else { 35 aw_led_off(0); 36 aw_led_off(1); 37 } 38 aw_mem_free(p_info); // 39 } 40 } 41 } static void key_process (aw_input_event_t *p_input_data, void *p_usr_data) 44 { 45 if (p_input_data->ev_type == AW_INPUT_EV_KEY) { // 46 aw_input_key_data_t *p_data = (aw_input_key_data_t *)p_input_data; 47 mail_key_info_t *p_info = ( mail_key_info_t *)aw_mem_alloc(sizeof( mail_key_info_t)); 48 if (p_info!= NULL) { 49 p_info->key_code = p_data->key_code; 50 p_info->key_state = p_data->key_state; 282

296 51 AW_MAILBOX_SEND( 52 mailbox_test, 53 (uint32_t)p_info, 54 AW_MAILBOX_NO_WAIT, 55 AW_MAILBOX_PRI_NORMAL); 56 } 57 } 58 } int aw_main() 61 { 62 static aw_input_handler_t key_handler; AW_MAILBOX_INIT(mailbox_test, 10, AW_MAILBOX_Q_PRIORITY); 65 AW_TASK_INIT( 66 task_led, // 67 "task_led", // 68 5, // , // 70 task_led_entry, // 71 NULL); // 72 AW_TASK_STARTUP(task_led); // task_led0 73 aw_input_handler_register(&key_handler, key_process, NULL); 74 while(1) { 75 aw_mdelay(1000); 76 } 77 } aw_mem_alloc() aw_mem_free() aw_mem_alloc() aw_mem_free() C malloc() free() aw_mem.h aw_mem_alloc() void *aw_mem_alloc(size_t size); size void* NULL aw_mem_free() void aw_mem_free(void *ptr); aw_mem_alloc()ptr aw_mem_alloc() AWorks

297 AWorks 4 AWorks aw_msgq.h AW_MSGQ_DECL(msgq, msg_num, msg_size) AW_MSGQ_DECL_STATIC(msgq, msg_num, msg_size) AW_MSGQ_INIT(msgq, msg_num, msg_size, options) AW_MSGQ_RECEIVE(msgq, p_buf, nbytes, timeout) AW_MSGQ_SEND(msgq, p_buf, nbytes, timeout, priority) AW_MSGQ_TERMINATE(msgq) 1 AW_MSGQ_DECL() AW_MSGQ_DECL_STATIC() AW_MSGQ_DECL(msgq, msg_num, msg_size) AW_MSGQ_DECL_STATIC(msgq, msg_num, msg_size) msgq msg_num msg_size msg_num msg_size msg_nummsg_size AW_MSGQ_DECL_STATIC(), static,, AW_MSGQ_DECL() msgq_test 10 int AW_MSGQ_DECL (msgq_test, 10, 4); int sizeof AW_MSGQ_DECL (msgq_test, 10, sizeof(int)); // 10 int AW_MSGQ_DECL()

298 struct my_struct { 2 //... 3 AW_MSGQ_DECL(msgq_test, 10, sizeof(int)); // 4 }; AW_MSGQ_DECL_STATIC() msgq_test AW_MSGQ_DECL_STATIC (msgq_test, 10, sizeof(int)); 2 AW_MSGQ_INIT() AW_MSGQ_INIT(msgq, msg_num, msg_size, options) msgq AW_MSGQ_DECL() AW_MSGQ_DECL_STATIC() msg_num msg_num msg_size msg_size options aw_msgq.h AW_MSGQ_Q_FIFO AW_MSGQ_Q_PRIORITY FIFO AW_SEM_Q_PRIORITY AW_SEM_Q_FIFO AW_MSGQ_INIT (msgq_test, 10, sizeof(int), AW_MSGQ_Q_PRIORITY); AW_MSGQ_INIT() ID aw_msgq_id_t ID 1 aw_msgq_id_t msgq_id = AW_ MSGQ_INIT (msgq_test, 10, 4, AW_MSGQ_Q_PRIORITY); aw_msgq_id_t ID ID NULL ID ID 3 AW_MSGQ_RECEIVE(msgq, p_buf, nbytes, timeout) msgq AW_MSGQ_DECL() AW_MSGQ_DECL_STATIC() 285

299 p_buf p_buf nbytes nbytes msgq_test 4 nbytes 4 p_buf 4 timeout aw_err_t 1AW_MSGQ_RECEIVE() AW_OK timeout 1 timeout AW_MSGQ_WAIT_FOREVER int data; 2 AW_MSGQ_RECEIVE(msgq_test, &data, sizeof(int), AW_MSGQ_WAIT_FOREVER); 2 timeout AW_MSGQ_NO_WAIT AW_MSGQ_RECEIVE()-AW_EAGAIN int data; 2 AW_MSGQ_RECEIVE(msgq_test, &data, sizeof(int), AW_MSGQ_NO_WAIT); 3 timeout timeout AW_MSGQ_RECEIVE() AW_OK timeout -AW_ETIME ms 1 int data; 2 AW_MSGQ_RECEIVE(msgq_test, &data, sizeof(int), aw_ms_to_ticks(500)); 4 AW_MSGQ_SEND(msgq, p_buf, nbytes, timeout, priority) msgq AW_MSGQ_DECL() AW_MSGQ_DECL_STATIC() p_buf nbytes nbytes msgq_test 4 nbytes 4 p_buf 4 timeout priority aw_err_t 1AW_MSGQ_SEND()AW_OK 286

300 timeout 1 timeout AW_MSGQ_WAIT_FOREVER int data = 5; 2 AW_MSGQ_SEND( 3 msgq_test, 4 &data, 5 sizeof(int), 6 AW_MSGQ_WAIT_FOREVER, 7 AW_MSGQ_PRI_NORMAL); priority AW_MSGQ_PRI_NORMAL AW_MSGQ_PRI_URGENT 2 timeout AW_MSGQ_NO_WAIT AW_MSGQ_SEND()-AW_EAGAIN int data = 5; 2 AW_MSGQ_SEND( 3 msgq_test, 4 &data, 5 sizeof(int), 6 AW_MSGQ_NO_WAIT, 7 AW_MSGQ_PRI_NORMAL); 3 timeout timeout AW_MSGQ_SEND() AW_OK timeout -AW_ETIME ms 1 int data = 5; 2 AW_MSGQ_SEND( 3 msgq_test, 4 &data, 5 sizeof(int), 6 aw_ms_to_ticks(500), 7 AW_MSGQ_PRI_NORMAL); 287

301 timeout AW_MSGQ_NO_WAIT 5 AW_MSGQ_TERMINATE(msgq) msgq AW_MSGQ_DECL() AW_MSGQ_DECL_STATIC(), -AW_ENXIO AW_MSGQ_TERMINATE(msgq_test); #include "aworks.h" 2 #include "aw_led.h" 3 #include "aw_delay.h" 4 #include "aw_task.h" 5 #include "aw_msgq.h" 6 #include "aw_input.h" 7 8 // 9 typedef struct { 10 int key_code; 11 int key_state; 12 } mail_key_info_t; AW_TASK_DECL_STATIC(task_led, 512); // 15 AW_MSGQ_DECL_STATIC(msgq_test, 10, sizeof( mail_key_info_t)); // static void task_led_entry (void *p_arg) // task_led 18 { 19 aw_err_t err; 20 mail_key_info_t info; 21 while(1) { 22 err =AW_MSGQ_RECEIVE( 23 msgq_test, 288

302 24 &info, 25 sizeof( mail_key_info_t), 26 AW_MSGQ_WAIT_FOREVER); 27 if (err == AW_OK) { 28 if (info.key_state!= 0) { 29 switch (info.key_code){ 30 case KEY_0: aw_led_off(0); aw_led_off(1); break; 31 case KEY_1: aw_led_off(0); aw_led_on(1); break; 32 case KEY_2: aw_led_on(0); aw_led_off(1); break; 33 case KEY_3: aw_led_on(0); aw_led_on(1); break; 34 default :break; 35 } 36 } else { 37 aw_led_off(0); 38 aw_led_off(1); 39 } 40 } 41 } 42 } static void key_process (aw_input_event_t *p_input_data, void *p_usr_data) 45 { 46 if (p_input_data->ev_type == AW_INPUT_EV_KEY) { // 47 aw_input_key_data_t *p_data = (aw_input_key_data_t *)p_input_data; 48 mail_key_info_t info; info.key_code = p_data->key_code; 51 info.key_state = p_data->key_state; 52 AW_MSGQ_SEND( 53 msgq_test, 54 &info, 55 sizeof( mail_key_info_t), 56 AW_MSGQ_NO_WAIT, 57 AW_MSGQ_PRI_NORMAL); 58 } 59 } int aw_main() 62 { 63 static aw_input_handler_t key_handler; AW_MSGQ_INIT(msgq_test, 10, sizeof( mail_key_info_t), AW_MSGQ_Q_PRIORITY); 66 AW_TASK_INIT( 67 task_led, // 289

303 68 "task_led", // 69 5, // , // 71 task_led_entry, // 72 NULL); // 73 AW_TASK_STARTUP(task_led); // task_led0 74 aw_input_handler_register(&key_handler, key_process, NULL); 75 while(1) { 76 aw_mdelay(1000); 77 } 78 } CPU CPU CPU CPU CPU CPU CPU CPU AWorks CPU CPU CPU 290

304 AWorks aw_spinlock.h void aw_spinlock_isr_init(aw_spinlock_isr_t *p_lock, int flags); void aw_spinlock_isr_take(aw_spinlock_isr_t *p_lock); void aw_spinlock_isr_give(aw_spinlock_isr_t *p_lock); AWorks isr CPU CPU AWorks 1 aw_spinlock_isr_t aw_spinlock.h aw_spinlock_isr_t lock; // p_lock 2 void aw_spinlock_isr_init(aw_spinlock_isr_t *p_lock, int flags); p_lock flags aw_spinlock_isr_init(&lock, 0); 3 void aw_spinlock_isr_take(aw_spinlock_isr_t *p_lock); p_lock CPU aw_spinlock_isr_take(&lock); 291

305 4 void aw_spinlock_isr_give(aw_spinlock_isr_t *p_lock); p_lock aw_spinlock_isr_give(&lock); task1 task2 task1 50ms 1 task LED #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_task.h" 4 #include "aw_vdebug.h" 5 #include "aw_spinlock.h" 6 7 AW_TASK_DECL_STATIC(task0, 512); // task0 8 AW_TASK_DECL_STATIC(task1, 512); // task static aw_spinlock_isr_t g_lock; // 11 static unsigned int g_test_data = 0; // static void task0_entry (void *p_arg) // 14 { 15 while(1) { 16 aw_spinlock_isr_take(& g_lock); 17 g_test_data++; 18 aw_spinlock_isr_give(& g_lock); 19 aw_mdelay(50); 20 } 21 }

306 23 static void task1_entry (void *p_arg) // 24 { 25 while(1) { 26 aw_spinlock_isr_take(& g_lock); 27 if ( g_test_data >= 10) { 28 g_test_data = 0; 29 aw_led_toggle(0); 30 } 31 aw_spinlock_isr_give(& g_lock); 32 aw_mdelay(100); 33 } 34 } int aw_main() 37 { 38 aw_spinlock_isr_init(& g_lock, 0); // 39 AW_TASK_INIT( 40 task0, // 41 "task0", // 42 5, // , // 44 task0_entry, // 45 NULL); // 46 AW_TASK_INIT( 47 task1, // 48 "task1", // 49 6, // , // 51 task1_entry, // 52 NULL); // 53 AW_TASK_STARTUP(task0); // task0 54 AW_TASK_STARTUP(task1); // task1 55 while(1) { 56 aw_mdelay(1000); 57 } 58 } 293

307 Windows AWorks /\ test1.txt /test1.txt /test5.txt /usr/base/test5.txt AWorks / UNIX/Linux Windows Windows \ NAND FLASHNor FLASH SD Card 294

308 NAND FLASHSD Card U 11.1 SD 2G 4 SD_S01GSD_S1512MSD_S2256M SD_S3256M4 4 FAT16/32UFFS YAFFS2 FAT16/32 U SD UFFS YAFFS2 NAND FLASH AWorks AWorks fs/aw_mount.h int aw_make_fs (const char *dev_name, const char *fs_name, const struct aw_fs_format_arg *fmt_arg); int aw_mount (const char const char const char unsigned *mnt, *dev, *fs, flags); int aw_umount (const char *path, unsigned flags); 1 int aw_make_fs (const char *dev_name, const char *fs_name, const struct aw_fs_format_arg *fmt_arg); dev_name fs_name fmt_arg AW_OK SD /dev/sdxx SD SDIO

309 SD TF SD SD 11.2(a)TF Micro SD SD TF 11.2(b)SD LOCK SD i.mx28x SDIO0 TF TF SD TF TF /dev/sd0 TF 11.2 SD TF TF U i.mx28x USB USB HOST1 USB USB HOST0 USB USB USB HOST1 U U /dev/ms0-ud0 U TF TF U TF /dev/ms0-ud0 fs_name vfatuffsyaffs FATvfat FAT FAT12FAT16 FAT32 fmt_arg struct aw_fs_format_arg fs/aw_fs_type.h struct aw_fs_format_arg { }; const char *vol_name; // size_t unit_size; // uint_t flags; // FAT volumevol_name awdisk FAT allocation unit unit_size FAT cluster unit_size unit_size unit_size 512 ~ FAT FAT12FAT16FAT FAT = K FAT12 32K*4096 = 128M FAT16 296

310 2G FAT32 T 32G FAT Windows NTFS FAT FAT flags 0 TF #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "fs/aw_mount.h" 5 6 int aw_main() 7 { 8 aw_err_t err; 9 const struct aw_fs_format_arg fmt = { // 10 "awdisk", // "awdisk" , // 4K 12 0 // flags 0 13 }; 14 while (1) { 15 err = aw_make_fs("/dev/sd0", "vfat", &fmt); // 16 if (err == -AW_ENODEV) { 17 aw_kprintf("can't find the device, try again!\r\n"); 18 aw_mdelay(1000); 19 } else if (err!= AW_OK) { 20 aw_kprintf("make fs failed! \r\n"); 21 break; 22 } else { 23 aw_kprintf("make fs OK! \r\n"); 24 break; 25 } 26 } 27 while(1) { 28 aw_mdelay(1000); 29 } 30 } TF TF /dev/sd0 aw_make_fs()-am_enodev TF -AM_ENODEV TF G TF 8 297

311 11.1 TF TF fs/aw_blk_dev.h int aw_blk_dev_wait_install (const char *p_name, int timeout); U SD TF / p_name /dev/sd0 timeout AW_OK timeout timeout AW_WAIT_FOREVER AW_NO_WAIT-AW_EAGAIN AW_OK-AW_ETIME #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "fs/aw_mount.h" 5 #include "fs/aw_blk_dev.h" 6 7 int aw_main() 8 { 9 const struct aw_fs_format_arg fmt = { // 10 "awdisk", // "awdisk" , // 4K 12 0 // flags 0 13 }; 14 aw_kprintf("wait for the device insert...\r\n"); 15 aw_blk_dev_wait_install("/dev/sd0", AW_WAIT_FOREVER); // 16 aw_kprintf("the device is Ready! Start make fs.\r\n"); if (aw_make_fs("/dev/sd0", "vfat", &fmt)!= AW_OK) { 19 aw_kprintf("make fs failed! \r\n"); 20 } else { 21 aw_kprintf("make fs OK! \r\n"); 22 } 23 while(1) { 24 aw_mdelay(1000); 25 } 298

312 26 } 2 TF int aw_mount (const char *mnt, const char *dev, const char *fs, unsigned flags); mnt /test test /test dev TF /dev/sd0 fs FAT vfatflags 0 AW_OK TF TF 1 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "fs/aw_mount.h" 5 #include "fs/aw_blk_dev.h" 6 7 int aw_main() 8 { 9 aw_kprintf("wait for the device insert...\r\n"); 10 aw_blk_dev_wait_install("/dev/sd0", AW_WAIT_FOREVER); // 11 aw_kprintf("the device is Ready! Start mount.\r\n"); if (aw_mount("/test", "/dev/sd0", "vfat", 0)!= AW_OK) { 14 aw_kprintf("mount failed!\r\n"); 15 } else { 16 aw_kprintf("mount OK! \r\n"); 17 } 18 while(1) { 19 aw_mdelay(1000); 20 } 21 } test TF 3 299

313 int aw_umount (const char *path, unsigned flags); path /dev/sd0 mnt /testflags 0 AW_OK #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "fs/aw_mount.h" 5 #include "fs/aw_blk_dev.h" 6 7 int aw_main() 8 { 9 aw_kprintf("wait for the device insert...\r\n"); 10 aw_blk_dev_wait_install("/dev/sd0", AW_WAIT_FOREVER); // 11 aw_kprintf("the device is Ready! Start mount.\r\n"); if (aw_mount("/test", "/dev/sd0", "vfat", 0)!= AW_OK) { // 14 aw_kprintf("mount failed!\r\n"); 15 } else { 16 aw_kprintf("mount OK! \r\n"); 17 } 18 aw_mdelay(10000); // 10s 19 if (aw_umount("/test", 0)!= AW_OK) { // 20 aw_kprintf("unmount failed!\r\n"); 21 } else { 22 aw_kprintf("unmount OK! \r\n"); 23 } 24 while(1) { 25 aw_mdelay(1000); 26 } 27 } /test/dev/sd

314 11.2 int aw_open (const char *path, int oflag, mode_t mode); int aw_create (const char *path, mode_t mode); int aw_close (int filedes); ssize_t aw_write (int filedes, const void *buf, size_t nbyte); ssize_t aw_read (int filedes, void *buf, size_t nbyte); io/aw_fcntl.h off_t aw_lseek (int filedes, off_t offset, int whence); int aw_ftruncate(int filedes, off_t length); filedes int aw_truncate (const char *path, off_t length); io/aw_unistd.h int aw_rename (const char *oldpath, const char *newpath); int aw_fsync(int fildes); int aw_unlink (const char *path); int aw_fstat (int fildes, struct aw_stat *buf); filedes int aw_stat (const char *path, struct aw_stat *buf); io/sys/aw_stat.h int aw_utime(const char *path, struct aw_utimbuf *times); io/aw_utime.h 1 int aw_open (const char *path, int oflag, mode_t mode); path test fs_test.txt path /test/fs_test.txt oflag io/aw_fcntl.h O_RDONLY O_WRONLY O_RDWR / O_APPEND O_CREAT O_EXCL O_CREAT O_TRUNC 0 O_DIRECTORY path mode mode_tmode_t 32 mode POSIX

315 mode ~ 7 mode 0777 C 0 mode test fs_test.txt int fd = aw_open("/test/fs_test.txt", O_RDWR O_CREAT, 0777); 2 3 if (fd < 0) { 4 aw_kprintf("open file failed! \r\n"); 5 } else { 6 aw_kprintf("open file OK! \r\n"); 7 } 2 int aw_create (const char *path, mode_t mode); path path mode aw_open(path, O_WRONLY O_CREAT O_TRUNC, mode); O_CREAT O_TRUNC 0-1 test fs_test2.txt int fd = aw_create("/test/fs_test2.txt", 0777); 2 if (fd < 0) { 3 aw_kprintf("create file failed! \r\n"); 4 } else { 5 aw_kprintf("create file OK! \r\n"); 6 } 302

316 3 int aw_close (int filedes); filedes AW_OK int fd = aw_open("/test/fs_test.txt", O_RDWR O_CREAT, 0777); // 2 //... 3 aw_close(fd); // 4 ssize_t aw_write (int filedes, const void *buf, size_t nbyte); filedes buf nbytes nbytes / O_APPEND #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "fs/aw_mount.h" 5 #include "fs/aw_blk_dev.h" 6 #include "io/aw_fcntl.h" 7 #include "io/aw_unistd.h" 8 #include "string.h" 9 10 int aw_main() 11 { 12 int fd; 13 char *wr_str = "just for test: "; aw_blk_dev_wait_install("/dev/sd0", AW_WAIT_FOREVER); // 303

317 16 17 if (aw_mount("/test", "/dev/sd0", "vfat", 0) == AW_OK) { // 18 fd = aw_open("/test/fs_test.txt", O_RDWR O_CREAT, 0777); // 19 if (aw_write(fd, wr_str, strlen(wr_str)) == strlen(wr_str)) { 20 aw_kprintf("write data OK!\r\n"); 21 } 22 aw_close(fd); // 23 } 24 while(1) { 25 aw_mdelay(1000); 26 } 27 } TF fs_test.txt just for test: TF TF PC Windows PC TF TF fs_test.txt PC TF 1 5 ssize_t aw_read (int filedes, void *buf, size_t nbyte); filedes buf nbytes 0 nbytes /test/fs_test.txt

318 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "fs/aw_mount.h" 5 #include "fs/aw_blk_dev.h" 6 #include "io/aw_fcntl.h" 7 #include "io/aw_unistd.h" 8 #include "string.h" 9 10 int aw_main() 11 { 12 int fd; 13 char *wr_str = "just for test: "; 14 char rd_buf[25] = {0}; aw_blk_dev_wait_install("/dev/sd0", AW_WAIT_FOREVER); // if (aw_mount("/test", "/dev/sd0", "vfat", 0) == AW_OK) { // 19 fd = aw_open("/test/fs_test.txt", O_RDONLY, 0); // 20 if (aw_read(fd, rd_buf, strlen(wr_str)) == strlen(wr_str)) { 21 aw_kprintf("read data is : %s\r\n", rd_buf); 22 if (strcmp(rd_buf, wr_str) == 0) { 23 aw_kprintf("data Correct!\r\n"); 24 } else { 25 aw_kprintf("data Error!\r\n"); 26 } 27 } 28 aw_close(fd); // 29 } 30 while(1) { 31 aw_mdelay(1000); 32 } 33 } 6 // aw_lseek() aw_lseek() off_t aw_lseek (int filedes, off_t offset, int whence); filedes offset whence offset whence SEEK_SET offset offset SEEK_SET

319 11.10 SEEK_SET 1 aw_lseek (fd, 0, SEEK_SET); // 0 2 aw_lseek (fd, 5, SEEK_SET); // 5 whence SEEK_CUR offset offset offset SEEK_CUR SEEK_CUR 1 off_t cur = aw_lseek (fd, 0, SEEK_CUR); // 0 2 aw_lseek (fd, 5, SEEK_CUR); // 5 3 aw_lseek (fd, -5, SEEK_CUR); // 5 whence SEEK_END offset offset SEEK_END SEEK_END 1 off_t filesize = aw_lseek (fd, 0, SEEK_END); // 0 2 aw_lseek (fd, 5, SEEK_END); // 5 3 aw_lseek (fd, -5, SEEK_END); // " " #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "fs/aw_mount.h" 5 #include "fs/aw_blk_dev.h" 6 #include "io/aw_fcntl.h" 7 #include "io/aw_unistd.h" 8 9 int aw_main() 10 { 11 int fd; 12 char rd_buf[11] = {0}; 13 aw_blk_dev_wait_install("/dev/sd0", AW_WAIT_FOREVER); // if (aw_mount("/test", "/dev/sd0", "vfat", 0) == AW_OK) { // 306

320 16 fd = aw_open("/test/fs_test.txt", O_RDONLY, 0); 17 aw_lseek(fd, 14, SEEK_SET); // aw_read(fd, rd_buf, 10); 19 aw_kprintf("read data is : %s\r\n", rd_buf); 20 aw_close(fd); 21 } 22 while(1) { 23 aw_mdelay(1000); 24 } 25 } 7 filedes int aw_ftruncate(int filedes, off_t length); filedes length length AW_OK fs_test.txt 14" " int fd = aw_open("/test/fs_test.txt", O_RDWR, 0777); 2 aw_ftruncate(fd, 14); 3 aw_close(fd); AWorks int aw_truncate (const char *path, off_t length); path length aw_truncate ("/test/fs_test.txt", 14); 8 int aw_rename (const char *oldpath, const char *newpath); oldpath newpath AW_OK /test/fs_test.txt/test/fs_test3.txt if (aw_rename("/test/fs_test.txt", "/test/fs_test3.txt")!= AW_OK) { 2 aw_kprintf("file rename failed!\n"); 3 } else { 4 aw_kprintf("file rename OK!\n"); 307

321 5 } newpath newpath oldpath 9 aw_fsync() Word int aw_fsync(int fildes); filedes AW_OK int fd = aw_open("/test/fs_test.txt", O_RDWR O_CREAT, 0777); 2 //... 3 aw_fsync(fd); // 4 //... 5 aw_fsync(fd); // 6 //... 7 aw_close(fd); // 10 int aw_unlink (const char *path); path AW_OK int fd = aw_open("/test/fs_test.txt", O_RDWR O_CREAT, 0777); 2 //... 3 aw_close(fd); // 4 aw_unlink("/test/fs_test.txt"); // 11 aw_fstat() int aw_fstat (int fildes, struct aw_stat *buf); fildes buf AW_OK struct aw_stat io/sys/aw_stat.h struct aw_stat { 308

322 dev_t st_dev; // ino_t st_ino; // mode_t st_mode; // nlink_t st_nlink; // uid_t st_uid; // id gid_t st_gid; // id dev_t st_rdev; // id off_t st_size; // byte struct timespec st_atim; // struct timespec st_mtim; // struct timespec st_ctim; // blksize_t st_blksize; // blkcnt_t st_blocks; // }; st_modest_sizest_atimst_mtim st_ctim st_mode mode st_size FAT st_blksize st_blocks st_blksize st_blocks st_atimst_mtimst_ctim st_atim st_mtim st_ctim struct timespec struct timespec { aw_time_t tv_sec; // unsigned long tv_nsec; // }; #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_time.h" 5 #include "io/sys/aw_stat.h" 6 #include "fs/aw_mount.h" 7 #include "fs/aw_blk_dev.h" 8 #include "io/aw_fcntl.h" 309

323 9 #include "io/aw_unistd.h" 10 int aw_main() 11 { 12 int fd; 13 struct aw_stat stat; 14 struct aw_tm tm; 15 aw_time_t ftime; aw_blk_dev_wait_install("/dev/sd0", AW_WAIT_FOREVER); // if (aw_mount("/test", "/dev/sd0", "vfat", 0) == AW_OK) { // 20 fd = aw_open("/test/fs_test.txt", O_RDONLY, 0); 21 aw_fstat(fd, &stat); // 22 ftime = stat.st_mtim.tv_sec; 23 aw_time_to_tm(&ftime, &tm); 24 aw_kprintf("file size is : %d\r\n", stat.st_size); 25 aw_kprintf("the mtim is : %04d-%02d-%02d %02d:%02d:%02d \r\n", 26 tm.tm_year+1900, tm.tm_mon + 1, tm.tm_mday, 27 tm.tm_hour, tm.tm_min, tm.tm_sec); 28 aw_close(fd); 29 } 30 while(1) { 31 aw_mdelay(1000); 32 } 33 } AWorks int aw_stat (const char *path, struct aw_stat *buf); path buf AW_OK aw_stat("/test/fs_test.txt", &stat); // 12 aw_utime() int aw_utime(const char *path, struct aw_utimbuf *times); path times struct aw_utimbuf io/aw_utime.h struct aw_utimbuf { time_t actime; // time_t modtime; // }; actime modtime 310

324 time_ttime_t actime modtime AW_OK :32: #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_time.h" 5 #include "io/sys/aw_stat.h" 6 #include "fs/aw_mount.h" 7 #include "fs/aw_blk_dev.h" 8 #include "io/aw_fcntl.h" 9 #include "io/aw_unistd.h" 10 #include "io/aw_utime.h" int aw_main() 13 { 14 struct aw_stat stat; 15 aw_time_t ftime; 16 struct aw_utimbuf utime; aw_tm_t tm = { 19 30, // , // , // , // , // , // , // 26 0, // 27-1 // 28 }; aw_tm_to_time(&tm, &ftime); 31 utime.actime = ftime; // 32 utime.modtime = ftime; // aw_blk_dev_wait_install("/dev/sd0", AW_WAIT_FOREVER); // if (aw_mount("/test", "/dev/sd0", "vfat", 0) == AW_OK) { // 37 aw_utime("/test/fs_test.txt", &utime); // 38 aw_stat("/test/fs_test.txt", &stat); // 39 ftime = stat.st_mtim.tv_sec; 311

325 40 aw_time_to_tm(&ftime, &tm); 41 aw_kprintf("the mtim is : %04d-%02d-%02d %02d:%02d:%02d \r\n", 42 tm.tm_year+1900, tm.tm_mon + 1, tm.tm_mday, 43 tm.tm_hour, tm.tm_min, tm.tm_sec); 44 } 45 while(1) { 46 aw_mdelay(1000); 47 } 48 } aw_utime() aw_stat() int aw_mkdir (const char *path, mode_t mode); io/sys/aw_stat.h struct aw_dir * aw_opendir (const char *dirname); struct aw_dirent *aw_readdir (struct aw_dir *dirp); int aw_readdir_r (struct aw_dir *dirp, struct aw_dirent *entry, io/aw_dirent.h struct aw_dirent **result); int aw_closedir (struct aw_dir *dirp); int aw_rmdir (const char *path); io/aw_unistd.h 1 int aw_mkdir (const char *path, mode_t mode); path /testnewdir path /test/newdir mode 0777 AW_OK /testnewdir #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "fs/aw_mount.h" 5 #include "fs/aw_blk_dev.h" 6 #include "io/sys/aw_stat.h" 7 312

326 8 int aw_main() 9 { 10 aw_blk_dev_wait_install("/dev/sd0", AW_WAIT_FOREVER); // if (aw_mount("/test", "/dev/sd0", "vfat", 0) == AW_OK) { // 13 if (aw_mkdir("/test/newdir", 0777) == AW_OK) { // newdir 14 aw_kprintf("create newdir OK!"); 15 } else { 16 aw_kprintf("create newdir failed!"); 17 } 18 } 19 while(1) { 20 aw_mdelay(1000); 21 } 22 } TF newdir TF TF PC Windows PC TF TF 11.4 (a) newdir newdir 11.4 (b) 11.4 PC TF 2 newdir 1 int fd = aw_open("/test/newdir/fs_test2.txt", O_RDWR O_CREAT, 0777); // 2 //... 3 aw_close(fd); 2 3 struct aw_dir * aw_opendir(const char *dirname); dirname test /test struct aw_dir io/aw_dirent.h 313

327 NULL struct aw_dir *p_dir = aw_opendir("/test"); 2 if (p_dir!= NULL) { 3 aw_kprintf("open dir OK!\r\n"); 4 } else { 5 aw_kprintf("open dir failed!\r\n"); 6 } 3 struct aw_dirent *aw_readdir (struct aw_dir *dirp); dirp struct aw_dirent #define NAME_MAX 255 struct aw_dirent { }; ino_t d_ino; char d_name[name_max + 1]; d_ino 10 0 ~ 9d_name 0 1 NULL struct aw_dir *p_dir = aw_opendir("/test"); 2 struct aw_dirent *p_diritem; 3 4 if (p_dir!= NULL) { 5 aw_kprintf("open dir OK!\r\n"); 6 while ((p_diritem = aw_readdir(p_dir))!= NULL) { 7 aw_kprintf("item: %d, %s\r\n", p_diritem->d_ino, p_diritem->d_name); 8 } 9 } else { 10 aw_kprintf("open dir failed!\r\n"); 11 } aw_readdir() 314

328 AWorks aw_readdir_r() int aw_readdir_r (struct aw_dir *dirp, struct aw_dirent *entry, struct aw_dirent **result); dirp entry result AW_OK entry result entry*result=entryresult NULL*result=NULL struct aw_dir *p_dir = aw_opendir("/test"); 2 struct aw_dirent *p_result; 3 struct aw_dirent entry; // 4 if (p_dir!= NULL) { 5 aw_kprintf("open dir OK!\r\n"); 6 while ((AW_OK == aw_readdir_r(p_dir, &entry, &p_result)) && (p_result!= NULL)) { 7 aw_kprintf("item: %d, %s\r\n", p_result->d_ino, p_result->d_name); 8 } 9 } else { 10 aw_kprintf("open dir failed!\r\n"); 11 } 4 int aw_closedir(struct aw_dir *dirp); dirp AW_OK #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "fs/aw_mount.h" 5 #include "fs/aw_blk_dev.h" 315

329 6 #include "io/aw_fcntl.h" 7 #include "io/sys/aw_stat.h" 8 #include "io/aw_dirent.h" 9 10 int aw_main() 11 { 12 struct aw_dir *p_dir; 13 struct aw_dirent *p_diritem; aw_blk_dev_wait_install("/dev/sd0", AW_WAIT_FOREVER); // 16 if (aw_mount("/test", "/dev/sd0", "vfat", 0) == AW_OK) { // 17 p_dir = aw_opendir("/test"); 18 if (p_dir!= NULL) { 19 aw_kprintf("open dir OK!\r\n"); 20 while ((p_diritem = aw_readdir(p_dir))!= NULL) { 21 aw_kprintf("item: %d, %s\r\n", p_diritem->d_ino, p_diritem->d_name); 22 } 23 aw_closedir(p_dir); 24 } else { 25 aw_kprintf("open dir failed!\r\n"); 26 } 27 } 28 while(1) { 29 aw_mdelay(1000); 30 } 31 } 5 int aw_rmdir(const char *path); path AW_OK struct aw_dir *p_dir = NULL; 2 aw_mkdir("/test/newdir", 0777) ; // 3 aw_opendir("/test/newdir"); // 4 //... 5 aw_closedir(p_dir); // 6 aw_rmdir("/test/newdir "); // 11.5 AWorks 316

330 typedef struct _student { 2 unsigned char id[6]; /* 6 */ 3 char name[10]; /* 10 */ 4 char sex; /* :'M''F' */ 5 float height; /* */ 6 float weight; /* */ 7 } student_t; #define STUDENTS_FILE_NAME "/test/students.txt" /* */ 2 3 int student_add (student_t *p_info) 4 { 5 /* 3 6 * - O_RDWR 7 * - O_APPEND 8 * - O_CREAT 9 */ 10 int fd = aw_open(students_file_name, O_RDWR O_APPEND O_CREAT, 0777); 11 if (p_info == NULL fd < 0) { 12 return -1; 13 } 14 aw_write(fd, p_info, sizeof(student_t)); /* */ 15 aw_close(fd); /* */ 16 return 0; 17 } /test/students.txt /test SD U p_info student_add() 317

331 int student_search(unsigned char id[6], student_t *p_info) 2 { 3 int fd = aw_open(students_file_name, O_RDONLY, 0777); /* */ 4 if (p_info == NULL fd < 0) { 5 return -1; 6 } 7 while (aw_read(fd, p_info, sizeof(student_t)) == sizeof(student_t)) { /* */ 8 if (memcmp(p_info->id, id, 6) == 0) { /* */ 9 return 0; 10 } 11 } 12 aw_close(fd); /* */ 13 return -1; 14 } log

332 250 0 ~ ~ ~ int db_id_to_idx (unsigned char id[6]) 2 { 3 int i; 4 int sum = 0; 5 for (i = 0; i < 6; i++) { 6 sum += id[i]; 7 } 8 return sum % 250; 9 } db_id_to_idx() 11.6 AWorks

333 AWorks aw_db_micro_hash_kv.h int aw_db_micro_hash_kv_init ( aw_db_micro_hash_kv_t uint16_t uint16_t uint16_t aw_db_micro_hash_kv_func_t const char int aw_db_micro_hash_kv_add ( aw_db_micro_hash_kv_t const void const void int aw_db_micro_hash_kv_search ( aw_db_micro_hash_kv_t const void void int aw_db_micro_hash_kv_del ( aw_db_micro_hash_kv_t const void int aw_db_micro_hash_kv_deinit ( aw_db_micro_hash_kv_t *p_db, size, key_size, value_size, pfn_hash, *file_name); *p_db, *p_key, *p_value); *p_db, *p_key, *p_value); *p_db, *p_key); *p_db); aw_db_micro_hash_kv aw_ AWorks db data base micro hash_kv hash 1 aw_db_micro_hash_kv_t aw_db_micro_hash_kv_t students_db; /* */ students_db p_db 2 int aw_db_micro_hash_kv_init ( aw_db_micro_hash_kv_t uint16_t *p_db, size, 320

334 uint16_t uint16_t aw_db_micro_hash_kv_func_t const char key_size, value_size, pfn_hash, *file_name); p_db size key_size 6 6 value_size typedef struct _student { 2 char name[10]; /* 10 */ 3 char sex; /* :'M''F' */ 4 float height; /* */ 5 float weight; /* */ 6 } student_t; value_size sizeof(student_t) pfn_hash aw_db_micro_hash_kv_func_t typedef unsigned int (*aw_db_micro_hash_kv_func_t) (const void *p_key); int hash_func_id_to_idx (const void *p_key) 2 { 3 const unsigned char *p_id = (const unsigned char *)p_key; 4 int i; 5 int sum = 0; 6 for (i = 0; i < 6; i++) { /* */ 7 sum += p_id[i]; 8 } 9 return sum % 250; /* */ 10 } hash_func_id_to_idx pfn_hash file_name 321

335 AWorks int ret = aw_db_micro_hash_kv_init (&students_db, 2 250, /* 250 */ 3 6, /* 6 */ 4 sizeof(student_t), /* */ 5 hash_func_id_to_idx, /* */ 6 "/test/students_hash.txt"); /* */ 7 if (ret < 0) { 8 // 9 } else { 10 // 11 } 3 int aw_db_micro_hash_kv_add ( aw_db_micro_hash_kv_t const void const void *p_db, *p_key, *p_value); p_db p_key key_size p_value x20, 0x16, 0x44, 0x70, 0x02, 0x "zhangshan" M cm 65.67kg unsigned char id[6] = {0x20, 0x16, 0x44, 0x70, 0x02, 0x39}; /* */ 322

336 2 student_t st_info = {"zhangshan", 'M', f, 65.67}; /* */ 3 4 int ret = aw_db_micro_hash_kv_add(&students_db, id, &st_info); /* */ 5 if (ret < 0) { 6 // 7 } else { 8 // 9 } 4 int aw_db_micro_hash_kv_search ( aw_db_micro_hash_kv_t const void void *p_db, *p_key, *p_value); p_db p_key key_size p_value unsigned char id_search[6] = {0x20, 0x16, 0x44, 0x70, 0x02, 0x39}; /* */ 2 student_t st_info_get; /* */ 3 4 int ret = aw_db_micro_hash_kv_search(&students_db, id_search, &st_info_get); 5 6 if (ret < 0) { 7 aw_kprintf("search nothing!!"); /* */ 8 } else { 9 aw_kprintf("searched! name : %s, sex: %c, height : %d.%02d cm, weight : %d.%02d kg\r\n", 10 st_info_get.name, 11 st_info_get.sex, 12 (int)st_info_get.height, (int)(st_info_get.height * 100) % 100, 13 (int)st_info_get.weight, (int)(st_info_get.weight * 100) % 100); 14 } aw_kprintf() 2 5 int aw_db_micro_hash_kv_del ( aw_db_micro_hash_kv_t const void *p_db, *p_key); 323

337 p_db p_key key_size unsigned char id_del[6] = {0x20, 0x16, 0x44, 0x70, 0x02, 0x39}; 2 3 ret = aw_db_micro_hash_kv_del (&students_db, id_del); 4 5 if (ret < 0) { 6 // 7 } else { 8 // 9 } int aw_db_micro_hash_kv_deinit (aw_db_micro_hash_kv_t *p_db); p_db ret = aw_db_micro_hash_kv_deinit(&students_db); 2 if (ret < 0) { 3 // 4 } else { 5 // 6 } #include "aworks.h" 2 #include "aw_vdebug.h" 3 #include "aw_delay.h" 4 #include "aw_db_micro_hash_kv.h" 324

338 5 6 typedef struct _student { 7 char name[10]; /* 10 */ 8 char sex; /* :'M''F' */ 9 float height; /* */ 10 float weight; /* */ 11 } student_t; static int hash_func_id_to_idx (const void *p_key) /* */ 14 { 15 const unsigned char *p_id = (const unsigned char *)p_key; 16 int i; 17 int sum = 0; 18 for (i = 0; i < 6; i++) { /* */ 19 sum += p_id[i]; 20 } 21 return sum % 250; /* */ 22 } /* */ 25 static int student_info_printf (unsigned char *p_id, student_t *p_student) 26 { 27 int i; 28 aw_kprintf("id:"); 29 for (i = 0; i < 6; i++) { 30 aw_kprintf("%02x",p_id[i]); 31 } 32 aw_kprintf(", name : %s, sex: %c, height : %d.%02d cm, weight : %d.%02d kg\n", 33 p_student->name, 34 p_student->sex, 35 (int)p_student->height, (int)(p_student->height * 100) % 100, 36 (int)p_student->weight, (int)(p_student->weight * 100) % 100); 37 return 0; 38 } /* */ 41 static int student_info_generate (unsigned char *p_id, student_t *p_student) 42 { 43 int i; 44 for (i = 0; i < 6; i++) { /* */ 45 p_id[i] = rand(); 46 } 47 for (i = 0; i < 9; i++) { /* 'a' ~ 'z' */ 48 p_student->name[i] = (rand() % ('z' - 'a')) + 'a'; 325

339 49 } 50 p_student->name[i]= '\0'; /* */ 51 p_student->sex = (rand() & 0x01)? 'F' : 'M'; /* */ 52 p_student->height = (float)rand() / rand(); 53 p_student->weight = (float)rand() / rand(); 54 return 0; 55 } int test_db_micro_hash_kv (void) 58 { 59 aw_db_micro_hash_kv_t students_db; /* */ 60 unsigned char id[6]; 61 student_t stu; 62 int i = 0; 63 int ret; 64 ret = aw_db_micro_hash_kv_init(&students_db, , /* 250 */ 66 6, /* 6 */ 67 sizeof(student_t), /* */ 68 hash_func_id_to_idx, /* */ 69 "/test/students_hash.txt"); /* */ 70 if (ret < 0) { 71 return -1; 72 } 73 while (i < 100) { /* 100 */ 74 student_info_generate(id, &stu); 75 if (aw_db_micro_hash_kv_search(&students_db, id, &stu) == 0) { /* */ 76 continue; 77 } 78 ret = aw_db_micro_hash_kv_add(&students_db, id, &stu); 79 if (ret < 0) { 80 return -1; 81 } 82 i++; /* */ 83 aw_kprintf("add student: "); 84 student_info_printf(id, &stu); 85 } 86 memset(&stu, 0, sizeof(student_t)); /* */ /* ID */ 89 ret = aw_db_micro_hash_kv_search(&students_db, id, &stu); 90 if (ret < 0) { 91 return -1; 92 } 326

340 93 ret = aw_db_micro_hash_kv_del (&students_db, id); /* */ 94 if (ret < 0) { 95 return -1; 96 } 97 ret = aw_db_micro_hash_kv_search(&students_db, id, &stu); /* */ 98 if (ret < 0) { 99 // 100 } else { 101 // 102 return -1; 103 } 104 return aw_db_micro_hash_kv_deinit(&students_db); 105 } int aw_main (void) 108 { 109 if (test_db_micro_hash_kv() < 0) { 110 printf("test failed!\r\n"); 111 } else { 112 printf("test ok!\r\n"); 113 } 114 while(1) { 115 aw_mdelay(100); 116 } 117 } test_db_micro_hash_kv() aw_min() test_db_micro_hash_kv()

341 12AWBus-lite 12.1 AWBus-lite MCU MCU CPU i.mx28x GPIOADCUART MCU PCF85063 I 2 C SD SDIO AWBus-lite CPU PLBProcessor Local BusCPU MCU 12.1(a) AWBus-lite 12.1(b) 12.1 AWBus-lite 328

342 AWBus-lite (a) 12.1(b) AWBus-lite 12.1(a) i.mx28x Pack boarduser Board MCUi.MX28x ICsMCU ARM CPU PLB PLB CPU PLB GPIOI 2 CUART PLB I 2 CI 2 C0 I 2 C bus 0I 2 C1 I 2 C bus 1 SC18IS602B I 2 C SPI CAT24C02EEPROMPCF85063RTC CAT9555 I 2 C GPIO SC18IS602B I 2 C SPI SPI SPI SPI SC16IS752 SPI UART 12.1(b) CAT9555 PCF85063 I 2 C bus AWBus-lite 12.1 AWbus-lite AWBus-Lite AWBus-lite 329

343 Bus Controller 0 CPU PLB Controller PLB GPIO CAT24C02CAT I 2 C0SC18IS602B AWBus-lite CPU CPU PLBPLB 12.1 I 2 C Bus 0I 2 C Bus 1SPI Bus i.mx28x GPIO LED GPIO GPIO LED AWBus-lite i.mx28x I 2 C0 I 2 C1 I 2 C I 2 C0 I 2 C I 2 C0 I 2 C (a) 12.1(b)AWorks SDK 330

344 AWBus-lite awbus_lite_hwconf_usrcfg.c AWorks SDK g_awbl_devhcf_list[] awbus_lite_hwconf_usrcfg.c 1 aw_const struct awbl_devhcf g_awbl_devhcf_list[] = { // 2 AWBL_HWCONF_IMX28_INTC // 3 AWBL_HWCONF_IMX28_GPIO // GPIO 4 AWBL_HWCONF_IMX28_DMA // DMA 5 AWBL_HWCONF_IMX28_DUART // DUART 6 AWBL_HWCONF_IMX28_AUART0 // AUART 7 AWBL_HWCONF_IMX28_I2C0 // I 2 C0 8 AWBL_HWCONF_IMX28_I2C1 // I 2 C1 9 AWBL_HWCONF_EP24CXX_0 // EEROMEP24CXX 10 AWBL_HWCONF_PCF85063_0 // RTC PCF // }; 13 aw_const size_t g_awbl_devhcf_list_count = AW_NELEMENTS(g_awbl_devhcf_list); AWBus-lite awbl_awbl AWBus-lite aw_const C const g_awbl_devhcf_list[]g_awbl_devhcf_list_count AW_NELEMENTS()aw_common.h #define AW_NELEMENTS(array) (sizeof (array) / sizeof ((array) [0])) struct awbl_devhcf struct awbl_devhcf awbus_lite.h 1 struct awbl_devhcf { 2 const char *p_name; // 3 uint8_t unit; // 4 uint8_t bus_type; // 5 uint8_t bus_index; // 6 struct awbl_dev *p_dev; // 7 const void *p_devinfo; // () 8 }; 1 331

345 i.mx28x I 2 C awbl_imx28_i2c.h AWBL_IMX28_I2C_NAME #define AWBL_IMX28_I2C_NAME "imx28_i2c" I 2 C I 2 C1 AWBL_IMX28_I2C_NAME PCF85063 awbl_pcf85063.h AWBL_PCF85063_NAME #define AWBL_PCF85063_NAME "pcf85063" PCF85063 AWBL_PCF85063_NAME 2 AWBus-lite 0 i.mx28x I 2 C I 2 C0 0I 2 C1 1 PCF85063 PCF PCF RTC RTC 0 ID RTC ID RTC ID ID i.mx28x RTC PLB I 2 C PCF85063 RTC PCF RTC RTC ID RTC 0 PCF ID 3 PLBI 2 CSPIUSB SDIO PCI awbus_lite.h 12.1 i.mx28x I 2 C1 CPU PLB I 2 C1 bus_type AWBL_BUSID_PLB 12.1 PLB AWBL_BUSID_PLB I 2 C AWBL_BUSID_I2C SPI AWBL_BUSID_SPI SDIO AWBL_BUSID_SDIO PCF85063 I 2 C I 2 C PCF85063 bus_type AWBL_BUSID_I2C 332

346 4 AWBus-lite 0 AWBus-lite PLB PLB i.mx28x I 2 C1 0 i.mx28x I 2 C I 2 C0I 2 C1 I 2 C I 2 C 01 PCF85063 I 2 C0 bus_index 0 I 2 C1 bus_index 1 5 AWBus-lite p_dev struct awbl_dev AWBus-lite PCF85063 struct awbl_pcf85063_dev { }; struct awbl_dev super; // // AWBus i.mx28x I 2 C1 awbl_imx28_i2c.h I 2 C struct awbl_imx28_i2c_dev I 2 C1 aw_local struct awbl_imx28_i2c_dev g_imx28_i2c1_dev; aw_local aw_local C static & g_imx28_i2c1_dev p_dev p_dev struct awbl_imx28_i2c_dev struct awbl_dev p_dev (struct awbl_dev *) & g_imx28_i2c1_dev PCF85063 awbl_pcf85063.h PCF85063 struct awbl_pcf85063_dev PCF85063 aw_local struct awbl_pcf85063_dev g_pcf85063_0_dev; & g_pcf85063_0_dev p_dev p_dev (struct awbl_dev *)& g_pcf85063_0_dev 333

347 6 p_devinfo I 2 C1 i.mx28x I 2 C1 awbl_imx28_i2c.h I 2 C struct awbl_imx28_i2c_devinfo I 2 C awbl_imx28_i2c.h 1 struct awbl_imx28_i2c_devinfo { 2 struct awbl_i2c_master_devinfo i2c_master_devinfo; // I 2 C 3 uint32_t regbase; // I 2 C 4 int inum; // 5 uint32_t clkfreq; // 6 void (*pfunc_plfm_init)(void); // 7 }; I 2 C I 2 C I 2 C i2c_master_devinfo I 2 C struct awbl_i2c_master_devinfo struct awbl_i2c_master_devinfo awbl_i2cbus.h 1 struct awbl_i2c_master_devinfo { 2 uint8_t bus_index; // 3 uint32_t speed; // 4 int timeout; // I 2 C 5 }; bus_index I 2 C I 2 C PCF85063 I 2 C1 speed I 2 C aw_prj_param.h ID 1 200KHz #define IMX28_I2C1_BUSID 1 #define AW_CFG_IMX28_I2C_BUS_SPEED bus_index speed timeout I 2 C AWBL_I2C_WAITFOREVER awbl_i2cbus.h tick regbase I 2 C i.mx28x imx28x_regbase.h I 2 C1 #define IMX28X_I2C1_BASE_ADDR 0x8005A000 I 2 C1 0x8005A000 i.mx28x 334

348 inum I 2 C I 2 C i.mx28x imx28x_inum.h I 2 C1 #define INUM_I2C1_ERROR_IRQ 110 I 2 C1 110 i.mx28x clkfreq I 2 C i.mx28x 24MHz pfunc_plfm_init I 2 C1 SCL SDA aw_local void imx28_i2c1_plfm_init (void) 2 { 3 aw_gpio_pin_cfg(pio3_16, PIO3_16_I2C1_SCL // I 2 C1 SCL 4 AWBL_IMX28X_GPIO_3V3 // 3.3V 5 AWBL_IMX28X_GPIO_12MA); // 12mA 6 7 aw_gpio_pin_cfg(pio3_17, PIO3_17_I2C1_SDA // I 2 C1 SDA 8 AWBL_IMX28X_GPIO_3V3 // 3.3V 9 AWBL_IMX28X_GPIO_12MA); // 12mA 10 }; imx28_i2c1_plfm_init pfunc_plfm_init I 2 C1 1 aw_local aw_const struct awbl_imx28_i2c_devinfo g_imx28_i2c1_devinfo = { 2 { 3 IMX28_I2C1_BUSID, // I 2 C 1 4 AW_CFG_IMX28_I2C_BUS_SPEED, // 200KHz 5 AWBL_I2C_WAITFOREVER // 6 }, 7 IMX28X_I2C1_BASE_ADDR, // I 2 C1 8 INUM_I2C1_ERROR_IRQ, // I 2 C , // I 2 C1 24MHz 10 imx28_i2c1_plfm_init, // 11 }; & g_imx28_i2c1_devinfo p_devinfo PCF85063 PCF85063 awbl_pcf85063.h PCF85063 awbl_pcf85063_devinfo_t

349 12.7 PCF85063 awbl_pcf85063.h 1 typedef struct awbl_pcf85063_devinfo { 2 struct awbl_rtc_servinfo rtc_servinfo; // RTC 3 uint8_t addr; // 4 } awbl_pcf85063_devinfo_t; rtc_servinfo RTC RTC RTC awbl_rtc.h 1 struct awbl_rtc_servinfo { 2 int rtc_id; // RTC ID 3 }; RTC RTC rtc_id RTC rtc_id 0 rtc_servinfo rtc_id ID 0 RTC rtc_id 0 addr PCF I 2 C PCF85063 PCF I 2 C 0x51 rtc_id addr PCF PCF aw_local aw_const struct awbl_pcf85063_devinfo g_pcf85063_0_devinfo = { 2 { 3 0 // RTC 4 }, 5 0x51 // I 2 C 6 }; & g_pcf85063_0_devinfo p_devinfo g_awbl_devhcf_list[]awbl_hwconf_ i.mx28x I 2 C1 AWBL_HWCONF_IMX28_I2C I 2 C1 1 #define AWBL_HWCONF_IMX28_I2C1 \ 2 { \ 3 AWBL_IMX28_I2C_NAME, \ 4 0, \ 5 AWBL_BUSID_PLB, \ 6 0, \ 336

350 7 (struct awbl_dev *)& g_imx28_i2c1_dev, \ 8 &( g_imx28_i2c1_devinfo) \ 9 }, PCF85063 AWBL_HWCONF_PCF8563_ PCF #define AWBL_HWCONF_PCF85063_0 \ 2 { \ 3 AWBL_PCF85063_NAME, \ 4 0, \ 5 AWBL_BUSID_I2C, \ 6 IMX28_I2C1_BUSID, \ 7 (struct awbl_dev *)& g_pcf85063_0_dev, \ 8 & g_pcf85063_0_devinfo \ 9 }, awbus_lite_hwconf_usrcfg.c I 2 C1 awbl_hwconf_imx28_i2c1.h PCF85063 awbl_hwconf_pcf85063_0.h 12.1I 2 C1 PLB PCF85063 I 2 C I 2 C1 PCF

351 PCF85063 rtc_id PCF85063AWBL_BUSID_I2C PCF85063 I 2 C I 2 C0 IMX28_I2C0_BUSID, PCF85063 AWBL_HWCONF_PCF85063_0 g_awbl_devhcf_list[] awbl_hwconf_pcf85063_0.h AWBL_HWCONF_PCF85063_ PCF85063 awbl_hwconf_pcf85063_0.h 1 #ifdef AW_DEV_EXTEND_PCF85063_0 2 aw_local aw_const struct awbl_pcf85063_devinfo g_pcf85063_0_devinfo = { // PCF { 4 0 // RTC 5 }, 6 0x51 // I 2 C 7 }; 8 9 aw_local struct awbl_pcf85063_dev g_pcf85063_0_dev; // PCF #define AWBL_HWCONF_PCF85063_0 \ 12 { \ 13 AWBL_PCF85063_NAME, \ 14 0, \ 15 AWBL_BUSID_I2C, \ 16 IMX28_I2C1_BUSID, \ 17 (struct awbl_dev *)& g_pcf85063_0_dev, \ 18 & g_pcf85063_0_devinfo \ 19 }, 20 #else 21 #define AWBL_HWCONF_PCF85063_0 22 #endif AW_DEV_EXTEND_PCF85063_0 AWBL_HWCONF_PCF85063_0 PCF85063 AWBL_HWCONF_PCF85063_0 PCF85063 I 2 C1 I 2 C I 2 C1 awbl_hwconf_imx28_i2c1.h 1 #ifdef AW_DEV_IMX28_I2C_1 2 aw_local void imx28_i2c1_plfm_init (void) 3 { 338

352 4 aw_gpio_pin_cfg(pio3_16, PIO3_16_I2C1_SCL // I 2 C1 SCL 5 AWBL_IMX28X_GPIO_3V3 // 3.3V 6 AWBL_IMX28X_GPIO_12MA); // 12mA 7 8 aw_gpio_pin_cfg(pio3_17, PIO3_17_I2C1_SDA // I 2 C1 SDA 9 AWBL_IMX28X_GPIO_3V3 // 3.3V 10 AWBL_IMX28X_GPIO_12MA); // 12mA 11 }; aw_local aw_const struct awbl_imx28_i2c_devinfo g_imx28_i2c1_devinfo = { 14 { 15 IMX28_I2C1_BUSID, // I 2 C 1 16 AW_CFG_IMX28_I2C_BUS_SPEED, // 200KHz 17 AWBL_I2C_WAITFOREVER // 18 }, 19 IMX28X_I2C1_BASE_ADDR, // I 2 C1 20 INUM_I2C1_ERROR_IRQ, // I 2 C , // I 2 C1 24MHz 22 imx28_i2c1_plfm_init, // 23 }; 24 #define AWBL_HWCONF_IMX28_I2C1 \ 25 { \ 26 AWBL_IMX28_I2C_NAME, \ 27 0, \ 28 AWBL_BUSID_PLB, \ 29 0, \ 30 (struct awbl_dev *)& g_imx28_i2c1_dev, \ 31 &( g_imx28_i2c1_devinfo) \ 32 }, #else 35 #define AWBL_HWCONF_IMX28_I2C1 36 #endif AW_DEV_IMX28_I2C_1 I 2 C1 AWorks aw_prj_params.h aw_prj_params.h 1 #define AW_DEV_EXTEND_PCF85063_0 2 #define AW_DEV_IMX28_I2C_1 aw_prj_params.h PCF

353 12.15 aw_prj_params.h 1 // #define AW_DEV_EXTEND_PCF85063_0 2 #define AW_DEV_IMX28_I2C_1 GPIO AWorks AWorks aw_prj_config.c awbl_group_init() awbl_group_init() PCF85063 awbl_pcf85063.h void awbl_pcf85063_drv_register (void); PCF85063 static void awbl_group_init( void ) { // } awbl_pcf85063_drv_register(); // PCF85063 aw_prj_config.c static void awbl_group_init( void ) 2 { 3 // 4 #ifdef AW_DRV_AWBL_EXTEND_PCF85063_0 5 awbl_pcf85063_drv_register(); 6 #endif 7 } AW_DRV_EXTEND_PCF85063_0 AWorks aw_prj_params.h #define AW_DRV_AWBL_EXTEND_PCF85063_0 PCF85063 PCF

354 #ifdef AW_DEV_EXTEND_PCF85063_0 #define AW_DRV_AWBL_EXTEND_PCF85063_0 #endif PCF85063 AW_DRV_AWBL_EXTEND_PCF85063_0 AWBus-lite / PCF85063AWBL_BUSID_I2C PCF85063 I 2 C I 2 C I 2 C i.mx28x I 2 C0 I 2 C1 I 2 C PCF85063 PCF85063 i.mx28x I 2 C0 I 2 C1 aw_prj_params.h #define AW_DEV_IMX28_I2C_0 #define AW_DEV_IMX28_I2C_1 // imx28 I 2 C0 // imx28 I 2 C1 PCF85063 I 2 C0 AW_DEV_IMX28_I2C_0 I 2 C1 AW_DEV_IMX28_I2C_1 i.mx28x I 2 C PLB PLB CPU PLB 12.1(b) SC16IS752 SC16IS752 SC18IS602B SC18IS602B I 2 C AWorks AWorks RTC RTC GPIO GPIO LED LED AWbus-lite i.mx28x RTC i.mx28x RTC PCF

355 12.5 RTC RTC PCF85063 RTC RX8025TDS RTC RTC 12.6 SC16IS752 SPI UART UART SC16IS752 SPI MCU 1 SC16IS752 4 COM0COM1COM2COM3 COM4 SC16IS752 PLB I 2 C SPI UART SC16IS752 UART MCU GPIO GPIO 342

356 GPIO GPIO 12.7 GPIO GPIO MCU GPIOPIO0_0~PIO6_24 CAT9555EXPIO0_0~EXPIO0_7EXPIO1_0~EXPIO1_ ID ID ID ID int 0 ID i.mx28x I 2 C0 awbl_hwconf_imx28_i2c0.h I 2 C I 2 C0 awbl_hwconf_imx28_i2c0.h 1 aw_local aw_const struct awbl_imx28_i2c_devinfo g_imx28_i2c0_devinfo = { 2 { 3 IMX28_I2C0_BUSID, // I 2 C0 4 //... I 2 C I 2 C 5 }, 6 // 7 }; IMX28_I2C0_BUSID I 2 C0 ID aw_prj_param.h I 2 C0 ID aw_prj_param.h 1 #define IMX28_I2C0_BUSID 0 I 2 C0 ID ID int ID ID ID 343

357 ID i.mx28x GPIO awbl_hwconf_imx28_gpio.h GPIO GPIO awbl_hwconf_imx28_gpio.h 1 aw_local struct awbl_imx28x_gpio_info g_imx28x_gpio_devinfo = { 2 // 3 { 4 PIO0_0, // 5 PIO6_24 // 6 }, 7 }; PIO0_0 ~ PIO6_24 GPIO ID GPIO ID imx28x_pin.h 1 #define PIO0_0 ( 0 ) 2 3 #define PIO6_0 ( 192 ) 4 #define PIO6_24 ( PIO6_ ) PIO0_0 0PIO6_24 216i.MX28x GPIO ID 0 ~ 216CAT9555 GPIO ID

358 13 AWbus-lite 13.1 ZLG LED AWorks AWorks aw_ LED aw_led_ LED LED LED setled aw_led_set LED LED aw_led_set() on off aw_led_onaw_led_off LED LED toggleled aw_led_toggle AWorks LED LED LED ID ID 0 LED 01 LED int id aw_led_set id LED LED LED aw_bool_taw_true LEDAW_FALSE LED aw_led_set() 345

359 aw_led_set (int id, aw_bool_t on); aw_led_onaw_led_off aw_led_toggle LED id aw_led_on(int id); aw_led_off(int id); aw_led_toggle(int id); id id LED id LED AWorks aw_err_t AW_OK aw_errno.h AW_OK aw_common.h #define AW_OK 0 aw_errno.h 6.2 LED id id LED -AW_ENODEVAW_ENODEV LED aw_err_tled LED aw_led.h aw_err_t aw_led_set (int id, aw_bool_t on); LED aw_err_t aw_led_on(int id); LED aw_err_t aw_led_off(int id); LED aw_err_t aw_led_toggle(int id); LED 13.1 LED aw_led.h ZLG 13.2 LED AWorks 346

360 AWorks AWBus-lite LED AWBus-lite LED 4 aw_led_on() aw_led_off() aw_led_set() aw_led_on() aw_led_off() 1 aw_err_t aw_led_on (int id) 2 { 3 return aw_led_set(id, AW_TRUE); 4 } 5 6 aw_err_t aw_led_off (int id) 7 { 8 return aw_led_set(id, AW_FALSE); 9 } aw_led_set() aw_led_toggle() LED GPIO LED aw_led_set()gpio LED 1 static const int g_led_pins[] = {PIO2_6, PIO2_5}; 2 int aw_led_set (int id, aw_bool_t on) 3 { 4 if (id >= sizeof(g_led_pins) / sizeof(g_led_pins[0])) { 5 return -AW_ENODEV; // ID LED 6 } 7 aw_gpio_set(g_led_pins[id],!on); // GPIO LED 8 return AW_OK; 9 } LED LED set <id> <on>id LED on LED LED0 "set 0 1"aw_led_set() aw_led_set()uart LED 1 int aw_led_set (int id, aw_bool_t on) 2 { 3 char buf[15]; 4 aw_snprintf(buf, 15, "set %d %d", id, on); 5 aw_serial_write(com1, buf, strlen(buf)); 6 return AW_OK; 7 } LED 347

361 LED LED LED GPIO LED UART LED LED LED aw_led_set() aw_led_toggle() LED LED aw_err_t (*pfn_led_set) (void *p_cookie, int id, aw_bool_t on); aw_err_t (*pfn_led_toggle) (void *p_cookie, int id); p_cookie C++ p_this C p_cookie void * struct awbl_led_servfuncs { }; aw_err_t (*pfn_led_set) (void *p_cookie, int id, bool_t on); aw_err_t (*pfn_led_toggle)(void *p_cookie, int id); LED AWBus-lite "awbl_" LED LED GPIO LED 13.4UART LED GPIO LED 1 static int led_gpio_set (void *p_cookie, int id, aw_bool_t on) 2 { 3 // LED aw_gpio_set() 4 return AW_OK; 5 } 6 7 static int led_gpio_toggle (void *p_cookie, int id) 8 { 9 // LED aw_gpio_toggle() 348

362 10 return AW_OK; 11 } 12 static const struct awbl_led_servfuncs g_led_gpio_drv_funcs = { 13 led_gpio_set, 14 led_gpio_toggle 15 }; 13.5 UART LED 1 static int led_uart_set (void *p_cookie, int id, aw_bool_t on) 2 { 3 // LED 4 return AW_OK; 5 } 6 7 static int led_uart_toggle (void *p_cookie, int id) 8 { 9 // LED 10 return AW_OK; 11 } static const struct awbl_led_servfuncs g_led_uart_drv_funcs = { 14 led_uart_set, 15 led_uart_toggle 16 }; g_led_gpio_drv_funcs g_led_uart_drv_funcs GPIO UART LED LED LED pfn_led_set pfn_led_toggle aw_led_set() aw_led_toggle() p_cookiep_cookie p_cookie p_this aw_led_set() p_cookie p_cookie p_cookie p_cookie p_cookie p_cookie struct awbl_led_service { }; const struct awbl_led_servfuncs *p_servfuncs; // void *p_cookie; // p_cookie 349

363 LED p_cookiep_servfuncs g_led_gpio_drv_funcs g_led_uart_drv_funcsp_cookie aw_led_set() LED pfn_led_set aw_led_set()1 1 struct awbl_led_service * gp_led_serv; 2 int aw_led_set (int id, aw_bool_t on) 3 { 4 struct awbl_led_service *p_serv = gp_led_serv; 5 if (p_serv == NULL) { 6 return -AW_ENODEV; 7 } 8 if (p_serv->p_servfuncs->pfn_led_set) { 9 return p_serv->p_servfuncs->pfn_led_set(p_serv->p_cookie, id, on); 10 } 11 return -AW_ENOTSUP; 12 } gp_led_serv LED pfn_led_set LED GPIO LED UART LED LED LED LED struct awbl_led_service p_next LED struct awbl_led_service { struct awbl_led_service *p_next; // LED }; const struct awbl_led_servfuncs *p_servfuncs; // void *p_cookie; // p_cookie LED LED ID LED ID ID LED LED LED ID ID LED LED LED ID LED ID LED LEDMiniPort-LED 8 LED LED LED LED LED LED 2 9 LED LED LED LED 350

364 struct awbl_led_servinfo { }; int start_id; // LED LED int end_id; // LED LED LED LED LED LED p_cookie LED LED LED awbl_led.h 1 struct awbl_led_service { 2 struct awbl_led_service *p_next; // LED 3 const struct awbl_led_servinfo *p_servinfo; // LED 4 const struct awbl_led_servfuncs *p_servfuncs; // 5 void *p_cookie; // p_cookie 6 }; LED LED LED id LED aw_led_set() aw_led_set()2 1 int aw_led_set (int id, aw_bool_t on) 2 { 3 struct awbl_led_service *p_serv = led_id_to_serv(id); // ID LED 4 if (p_serv == NULL) { 5 return -ENODEV; 6 } 7 if (p_serv->p_servfuncs->pfn_led_set) { 8 return p_serv->p_servfuncs->pfn_led_set(p_serv->p_cookie, id, on); 9 } 10 return -AW_ENOTSUP; 11 } led_id_to_serv() ID LED led_id_to_serv() LED id LED ID id LED id LED ID LED 1 aw_local struct awbl_led_service * gp_led_serv_head = NULL; 2 aw_local struct awbl_led_service * led_id_to_serv (int id) 3 { 4 struct awbl_led_service *p_serv_cur = gp_led_serv_head; 5 while (p_serv_cur!= NULL) { 6 if ((id >= p_serv_cur->p_servinfo->start_id) && (id <= p_serv_cur->p_servinfo->end_id)) { 351

365 7 return p_serv_cur; // id LED LED 8 } 9 p_serv_cur = p_serv_cur->p_next; 10 } 11 return NULL; // id LED NULL 12 } gp_led_serv_head NULL LED aw_led_toggle() aw_led_toggle() 1 int aw_led_toggle (int id) 2 { 3 struct awbl_led_service *p_serv = led_id_to_serv(id); // ID LED 4 if (p_serv == NULL) { 5 return -ENODEV; 6 } 7 if (p_serv->p_servfuncs->pfn_led_toggle) { 8 return p_serv->p_servfuncs->pfn_led_toggle(p_serv->p_cookie, id); 9 } 10 return -AW_ENOTSUP; 11 } LED gp_led_serv_head NULL led_id_to_serv() NULL -AM_ENODEV Method LED LED LED gp_led_serv_head LED AWbus-lite Method AWBus-lite Method Method awbus_lite.h AWBL_METHOD_DEF(method, string) AWBL_METHOD(name, handler) AWBL_METHOD_END AWBL_METHOD_IMPORT(name) AWBL_METHOD_CALL(method) Method Method Method Method Method ID 1 Method AWBL_METHOD_DEF() Method AWBL_METHOD_DEF(method, string) 352

366 method Method string method Method Method Method LED LED LED Method Method AWBL_METHOD_DEF(awbl_ledserv_get, "awbl_ledserv_get"); awbl_ledserv_get Method Method LED LED LED LED Method Method LED 2 Method Method Method AWBus-lite Method Method AWBus-lite Method AWBL_METHOD(name, handler) name AWBL_METHOD_DEF() Method handler awbl_ledserv_get LED Method handler LED handler awbl_method_handler_tawbus_lite.h typedef aw_err_t (*awbl_method_handler_t)(struct awbl_dev *p_dev, void *p_arg); awbl_method_handler_t p_dev p_argp_dev p_this handler p_dev p_arg void * LED p_arg struct awbl_led_service ** LED LED LED LED GPIO LED LED Method LED Method 1 aw_local aw_err_t gpio_ledserv_get (struct awbl_dev *p_dev, void *p_arg) 2 { 3 // LED p_serv 4 5 *(struct awbl_led_service **)p_arg = p_serv; // p_serv 353

367 6 return AW_OK; 7 } 8 9 // Method 10 aw_local aw_const struct awbl_dev_method g_led_gpio_dev_methods[] = { 11 AWBL_METHOD(awbl_ledserv_get, gpio_ledserv_get), // LED Method 12 //... Method 13 }; g_led_gpio_dev_methods Method Method LED LED 3 Method Method AWBL_METHOD_END Method AWBL_METHOD_END Method GPIO LED Method LED AWBL_METHOD_END AWBL_METHOD_END 1 // Method 2 aw_local aw_const struct awbl_dev_method g_led_gpio_dev_methods[] = { 3 AWBL_METHOD(awbl_ledserv_get, gpio_ledserv_get), // LED Method 4 AWBL_METHOD_END // 5 }; 4 Method Method Method Method C extern AWBL_METHOD_IMPORT(name) name AWBL_METHOD_DEF() Method Method Method awbl_ledserv_get Method AWBL_METHOD_IMPORT() 1 // Method awbl_ledserv_get 2 AWBL_METHOD_IMPORT(awbl_ledserv_get); 3 4 // Method 5 aw_local aw_const struct awbl_dev_method g_led_gpio_dev_methods[] = { 6 AWBL_METHOD(awbl_ledserv_get, gpio_ledserv_get), // LED Method 7 AWBL_METHOD_END // 8 }; 354

368 5 Method ID Method Method Method Method Method IDID Method ID AWBL_METHOD_CALL(method) method AWBL_METHOD_DEF() Method Method IDawbl_method_id_tID Method ID Method ID Method AWbus-lite Method awbus_lite.h awbl_method_handler_t awbl_dev_method_get(struct awbl_dev awbl_method_id_t *p_dev, method); p_dev Method method Method ID ID method method NULL p_dev LED AWBL_METHOD_ CALL() 1 awbl_method_handler_t pfn_led_serv = NULL; 2 struct awbl_led_service *p_led_serv = NULL; 3 pfn_led_serv = awbl_dev_method_get(p_dev, AWBL_METHOD_CALL(awbl_ledserv_get)); 4 if (pfn_led_serv!= NULL) { // LED 5 pfn_led_serv(p_dev, &p_led_serv); // LED 6 if (p_led_serv!= NULL) { 7 // LED 8 } 9 } AWBL_METHOD_ CALL() Method awbl_ledserv_get ID awbl_dev_method_get() Method LED LED LED LED LED gp_led_serv_head LED LED LED AWBus-lite aw_err_t awbl_dev_iterate(awbl_iterate_func_t pfunc_action, void int *p_arg, flags); 355

369 pfunc_action p_arg pfunc_action flags pfunc_action awbl_iterate_func_tawbus_lite.h aw_err_t (*awbl_iterate_func_t)(struct awbl_dev *p_dev, void *p_arg); awbl_iterate_func_t p_dev p_argp_dev p_this pfunc_action p_dev p_arg awbl_dev_iterate() p_arg flags pfunc_action awbus_lite.h AWBL_ITERATE_INSTANCES AWBL_ITERATE_ORPHANS AWBL_ITERATE_INTRABLE pfunc_action AWBL_ITERATE_INSTANCES AWBL_ITERATE_ORPHANS pfunc_action AWBL_ITERATE_INSTANCES AWBL_ITERATE_ORPHANS AWBL_ITERATE_INTRABLE pfunc_action pfunc_action AW_OK LED pfunc_action LED gp_led_serv_head LED LED 1 AWBL_METHOD_IMPORT(awbl_ledserv_get); // LED Method 2 3 aw_local struct awbl_led_service * gp_led_serv_head = NULL; // LED 4 5 // LED 6 aw_local aw_err_t led_serv_alloc_helper (struct awbl_dev *p_dev, void *p_arg) 7 { 8 awbl_method_handler_t pfn_led_serv = NULL; 9 struct awbl_led_service *p_led_serv = NULL;

370 11 // Method NULL 12 pfn_led_serv = awbl_dev_method_get(p_dev, AWBL_METHOD_CALL(awbl_ledserv_get)); if (pfn_led_serv!= NULL) { // Method LED 15 pfn_led_serv(p_dev, &p_led_serv); // LED 16 if (p_led_serv!= NULL) { // LED 17 p_led_serv->p_next = gp_led_serv_head; // LED 18 gp_led_serv_head = p_led_serv; // p_serv 19 } 20 } 21 return AW_OK; 22 } 23 void awbl_led_init (void) 24 { 25 gp_led_serv_head = NULL; 26 awbl_dev_iterate( led_serv_alloc_helper, NULL, AWBL_ITERATE_INSTANCES); 27 return AW_OK; 28 } LED AWBL_ITERATE_INSTANCES LED awbl_led_init() LED aw_prj_config.c aw_prj_early_init() awbl_led_init() awbl_led_init() 1 void aw_prj_early_init( void ) 2 { 3 //... 4 #ifdef AW_COM_AWBL_LED 5 awbl_led_init(); 6 #endif 7 //... 8 } aw_prj_params.h LED AW_DEV_GPIO_LED LED AW_COM_AWBL_LED LED awbl_led_init() AW_COM_AWBL_LED aw_prj_params.h 1 #ifdef AW_DEV_GPIO_LED 2 #define AW_COM_AWBL_LED 3 #endif 357

371 LED LED LED id led_id_to_serv() NULL LED LED LED LED LED 13.3 Method LED LED LED LED LED AWBus-lite Method AWBus-lite AWBus-lite struct awbl_drvinfo struct awbl_drvinfo awbl_lite.h 1 struct awbl_drvinfo { 2 uint8_t awb_ver; // AWBus 3 uint8_t bus_id; // ID 4 char *p_drvname; // 5 const struct awbl_drvfuncs *p_busfuncs; // 6 const struct awbl_dev_method *p_methods; // Method 7 bool_t (*pfunc_drv_probe) (awbl_dev_t *p_dev); // 8 }; 1 AWBus-lite awb_ver AWBus-lite AWBus-lite AWBL_VER_1 awbus_lite.h #define AWBL_VER_1 1 awb_ver AWBL_VER_1 2 ID bus_id ID

372 AWBL_DEVID_DEVICE AWBL_DEVID_BUSCTRL bus_id C AWBL_DEVID_DEVICE GPIO LED GPIO GPIO AWBus-lite GPIO PLB AWBL_BUSID_PLBLED AWBL_DEVID_DEVICE bus_id AWBL_BUSID_PLB AWBL_DEVID_DEVICE AWBL_DEVID_DEVICE AWBL_BUSID_PLB i.mx28x I 2 C PLB AWBL_BUSID_PLBi.MX28x I 2 C I 2 C AWBL_DEVID_BUSCTRLbus_id AWBL_BUSID_PLB AWBL_DEVID_BUSCTRL PCF85063 I 2 C AWBL_BUSID_I2CPCF85063 AWBL_DEVID_DEVICEbus_id AWBL_BUSID_I2C AWBL_DEVID_DEVICE AWBL_DEVID_DEVICE AWBL_BUSID_I2C 3 p_drvname AWBus-lite GPIO LED #define GPIO_LED_NAME "gpio_led" 4 GPIO LED p_busfuncs struct awbl_drvfuncs struct awbl_drvfuncs struct awbl_drvfuncs awbus_lite.h 1 struct awbl_drvfuncs { // 2 void (*pfunc_dev_init1) (struct awbl_dev *p_dev); // () 3 void (*pfunc_dev_init2) (struct awbl_dev *p_dev); // () 4 void (*pfunc_dev_connect) (struct awbl_dev *p_dev); // () 5 }; 359

373 3 AWBus-lite void (*) (struct awbl_dev *p_dev); GPIO LED aw_local void led_gpio_inst_init1(awbl_dev_t *p_dev) 2 { 3 } 4 5 aw_local void led_gpio_inst_init2(awbl_dev_t *p_dev) 6 { 7 } 8 9 aw_local void led_gpio_inst_connect(awbl_dev_t *p_dev) 10 { 11 } aw_local aw_const struct awbl_drvfuncs g_awbl_drvfuncs_led_gpio = { 14 led_gpio_inst_init1, 15 led_gpio_inst_init2, 16 led_gpio_inst_connect 17 }; g_awbl_drvfuncs_led_gpio p_busfuncs p_dev p_dev AWBus-lite OS 360

374 aw_main() 30 1 ZLG AWorks ZDS AWBus-lite 1 5 Method LED LED LED Method LED Method Method 1 aw_local aw_err_t gpio_ledserv_get (struct awbl_dev *p_dev, void *p_arg) 2 { 3 // LED p_serv 4 5 *(struct awbl_led_service **)p_arg = p_serv; // p_serv 6 return AW_OK; 7 } 8 9 AWBL_METHOD(awbl_ledserv_get, gpio_ledserv_get), // LED Method Method Method AWBus-lite Method AWBL_METHOD_END p_methods Method Method 1 aw_local aw_const struct awbl_dev_method g_led_gpio_dev_methods[] = { 361

375 2 AWBL_METHOD(awbl_ledserv_get, gpio_ledserv_get), // LED Method 3 4 //... Method 5 6 AWBL_METHOD_END // 7 }; g_led_gpio_dev_methods p_methods Method 6 pfunc_drv_probe aw_bool_t (*) (awbl_dev_t *p_dev); p_dev p_dev AW_TRUE pfunc_drv_probe NULL AW_TRUE AWBus-lite AW_FALSE AWBus-lite pfunc_drv_probe NULL Method LED Method

376 PLB awbl_plb_drvinfo_t awbl_plb_drvinfo_t awbl_plb.h 1 typedef struct awbl_plb_drvinfo{ 2 struct awbl_drvinfo super; // AWBus-lite 3 } awbl_plb_drvinfo_t; I 2 C awbl_i2c_drvinfo_t awbl_i2c_drvinfo_t awbl_i2cbus.h 1 typedef struct awbl_i2c_drvinfo { 2 struct awbl_drvinfo super; // AWBus-lite 3 } awbl_i2c_drvinfo_t; AWBus-lite struct awbl_dev LED 1 struct awbl_led_gpio_dev { 2 struct awbl_dev dev; 3 // 4 }; LED LED LED LED LED awbl_led.h 1 struct awbl_led_service { 2 struct awbl_led_service *p_next; // LED 3 const struct awbl_led_servinfo *p_servinfo; // LED 4 const struct awbl_led_servfuncs *p_servfuncs; // 5 void *p_cookie; // p_cookie 6 }; LED LED LED LED LED 363

377 LED LED LED LED 1 struct awbl_led_gpio_dev { 2 struct awbl_dev dev; // AWBus-lite 3 struct awbl_led_service led_serv; // LED 4 }; LED LED aw_local struct awbl_led_gpio_dev g_led_gpio_dev; LED GPIO LED LED GPIO LED LED GPIO LED LEDLED struct awbl_led_gpio_param { const uint16_t *p_led_gpios; // LED uint8_t num_leds; // LED uint8_t active_low; // LED LED }; GPIO GPIO GPIO struct awbl_led_gpio_param { const uint16_t *p_led_gpios; // LED uint8_t num_leds; // LED uint8_t active_low; // LED void (*pfn_plfm_init)(void); // LED }; pfn_plfm_init LED NULL LED 364

378 LED LED LED LED LED LED LED 1 struct awbl_led_servinfo { 2 int start_id; // LED LED 3 int end_id; // LED LED 4 }; LED LED ID ID LED LED 1 struct awbl_led_gpio_param { 2 const uint16_t *p_led_gpios; // LED 3 struct awbl_led_servinfo led_servinfo; // LED 4 uint8_t num_leds; // LED 5 uint8_t active_low; // LED 6 void (*pfn_plfm_init)(void); // LED 7 }; EPC-AW280 LED RUNError PIO2_6 PIO2_ GPIO LED GPIO LED LED ID 01LED LED LED 1 aw_local aw_const uint16_t g_led_gpios[] = { // LED GPIO 2 PIO2_6, // RUN LED 3 PIO2_5 // Error LED 4 }; 5 6 aw_local aw_const struct awbl_led_gpio_param g_led_gpio_param = { // LED 7 g_led_gpios, // LED 8 { 9 0, // 10 AW_NELEMENTS( g_led_gpios)-1 // LED 12 LED 1 11 }, 12 AW_NELEMENTS( g_led_gpios), // LED 13 AW_TRUE, // GPIO LED 14 NULL // NULL 15 }; 365

379 LED GPIO awbl_dev_t * p_dev p_dev GPIO LED struct awbl_led_gpio_dev p_dev p_dev 1 aw_local void led_gpio_inst_init2(awbl_dev_t *p_dev) 2 { 3 struct awbl_led_gpio_dev *p_this = (struct awbl_led_gpio_dev *)p_dev; // 4 // p_this 5 } AWBus-lite p_dev AWBL_DEVHCF_GET() const struct awbl_devhcf * struct awbl_devhcf AWBL_DEVHCF_GET() 1 aw_local void led_gpio_inst_init2(awbl_dev_t *p_dev) 2 { 3 const struct awbl_devhcf *p_devhcf = AWBL_DEVHCF_GET(p_dev); // 4 p_devhcf->p_name // 5 p_devhcf->unit // 6 p_devhcf->bus_type // 7 p_devhcf->bus_index // 8 p_devhcf->p_devinfo // 9 } AWBus-lite awbus_lite.h AWBL_DEV_NAME_GET(p_dev) AWBL_DEV_UNIT_GET(p_dev) AWBL_DEV_BUS_TYPE_GET(p_dev) AWBL_DEV_BUS_INDEX_GET(p_dev) AWBL_DEVINFO_GET(p_dev) 366

380 const void *p_devinfo GPIO LED struct awbl_led_gpio_param aw_local void led_gpio_inst_init2(awbl_dev_t *p_dev) 2 { 3 struct awbl_led_gpio_param *p_par = (struct awbl_led_gpio_param*)awbl_devinfo_get(p_dev); 4 // p_par p_par->active_low 5 } aw_local void led_gpio_inst_init1(awbl_dev_t *p_dev) 2 { 3 } 2 GPIO aw_local void led_gpio_inst_init2(awbl_dev_t *p_dev) 2 { 3 struct awbl_led_gpio_param *p_par = (struct awbl_led_gpio_param*)awbl_devinfo_get(p_dev); 4 int i = 0, gpio_pin = 0; 5 if (p_par->pfn_plfm_init!= NULL) { // 6 p_par->pfn_plfm_init(); 7 } 8 for (i = 0; i < p_par->num_leds; i++) { 9 gpio_pin = p_par->p_led_gpios[i]; // 10 aw_gpio_pin_cfg(gpio_pin, AW_GPIO_OUTPUT); // 11 aw_gpio_set(gpio_pin, p_par->active_low); // LED 12 } 13 } LED active_low LED active_low 1 LED active_low LED active_low GPIO LED 13.6 active_low GPIO LED LED 13.6 LED LED LED active_low GPIO

381 GPIO active_low LED 3 LED aw_local void led_gpio_inst_connect(awbl_dev_t *p_dev) 2 { 3 } struct awbl_drvfuncs struct awbl_drvfuncs 1 aw_local aw_const struct awbl_drvfuncs g_awbl_drvfuncs_led_gpio = { 2 led_gpio_inst_init1, 3 led_gpio_inst_init2, 4 led_gpio_inst_connect 5 }; g_awbl_drvfuncs_led_gpio p_busfuncs struct awbl_drvfuncs NULL pfunc_dev_init1 pfunc_dev_connect NULL struct awbl_drvfuncs struct awbl_drvfuncs 1 aw_local aw_const struct awbl_drvfuncs g_awbl_drvfuncs_led_gpio = { 2 NULL, 3 led_gpio_inst_init2, 4 NULL 5 }; LED LED LED LED LED LED LED awbl_led.h 1 struct awbl_led_service { 2 struct awbl_led_service *p_next; // LED 3 const struct awbl_led_servinfo *p_servinfo; // LED 4 const struct awbl_led_servfuncs *p_servfuncs; // 5 void *p_cookie; // p_cookie 6 }; 368

382 LED struct awbl_led_service led_serv LED led_serv 1 p_next LED p_next LED LED LED p_next NULL LED p_next 1 struct awbl_led_gpio_dev *p_this = (struct awbl_led_gpio_dev *)p_dev; 2 p_this->led_serv.p_next = NULL; 2 p_servinfo LED p_servinfo LED LED LED p_servinfo LED LED p_servinfo 1 struct awbl_led_gpio_dev *p_this = (struct awbl_led_gpio_dev *)p_dev; 2 struct awbl_led_gpio_param *p_par = (struct awbl_led_gpio_param*)awbl_devinfo_get(p_dev); 3 4 p_this->led_serv.p_servinfo = &p_par->led_servinfo; 3 p_servfuncs LED struct awbl_led_servfuncs struct awbl_led_servfuncs awbl_led.h 1 struct awbl_led_servfuncs { 2 aw_err_t (*pfn_led_set) (void *p_cookie, int id, bool_t on); 3 aw_err_t (*pfn_led_toggle)(void *p_cookie, int id); 4 }; LED p_servfuncs p_servfuncs LED struct awbl_led_servfuncs LED 1 aw_local aw_err_t led_gpio_set (void *p_cookie, int id, bool_t on) 2 { 3 struct awbl_led_gpio_dev *p_this = (struct awbl_led_gpio_dev *)p_cookie; 4 struct awbl_led_gpio_param *p_par = (struct awbl_led_gpio_param*)awbl_devinfo_get(p_this); 5 6 int gpio_pin = id - p_par->led_servinfo.start_id; // GPIO 7 8 aw_gpio_set(p_par->p_led_gpios[gpio_pin], on ^ p_par->active_low); // GPIO 9 369

383 10 return AW_OK; 11 } aw_local aw_err_t led_gpio_toggle(void *p_cookie, int id) 14 { 15 struct awbl_led_gpio_dev *p_this = (struct awbl_led_gpio_dev *)p_cookie; 16 struct awbl_led_gpio_param *p_par = (struct awbl_led_gpio_param*)awbl_devinfo_get(p_this); int gpio_pin = id - p_par->led_servinfo.start_id; aw_gpio_toggle(p_par->p_led_gpios[gpio_pin]); // GPIO return AW_OK; 23 } aw_local aw_const struct awbl_led_servfuncs g_led_servfuncs = { 26 led_gpio_set, 27 led_gpio_toggle 28 }; p_cookie p_cookie void * struct awbl_led_gpio_dev *p_cookie p_cookie LED LED ID LED 0 LED ID LED LED ID ID int gpio_pin = id - p_par->led_servinfo.start_id; led_gpio_set() on LED LED active_low on active_low GPIO 13.7 active_low 0 GPIO LED on 1 LED GPIO on 0 LED GPIO 13.7 GPIO active_low on GPIO GPIO active_low on active_low on GPIO 0 active_low on GPIO GPIO active_low on GPIO aw_gpio_set(p_par->p_led_gpios[gpio_pin], on ^ p_par->active_low); // GPIO 370

384 led_gpio_toggle() GPIO active_low aw_gpio_toggle(p_par->p_led_gpios[gpio_pin]); // GPIO LED g_led_servfuncs LED p_servfuncs p_servfuncs 1 struct awbl_led_gpio_dev *p_this = (struct awbl_led_gpio_dev *)p_dev; 2 p_this->led_serv.p_servfuncs = & g_led_servfuncs; 4 p_cookie LED p_cookie p_cookie p_cookie LED p_cookie LED p_cookie LED p_cookie p_cookie p_this LED p_cookie p_this p_cookie 1 struct awbl_led_gpio_dev *p_this = (struct awbl_led_gpio_dev *)p_dev; 2 p_this->led_serv.p_cookie = (void *)p_this; LED p_cookie LED LED LED LED Method Method LED LED Method Method Method LED Method awbl_ledserv_get Method LED LED 1 aw_local aw_err_t gpio_ledserv_get (struct awbl_dev *p_dev, void *p_arg) 2 { 3 struct awbl_led_gpio_dev *p_this = (struct awbl_led_gpio_dev *)p_dev; 4 struct awbl_led_gpio_param *p_par = (struct awbl_led_gpio_param*)awbl_devinfo_get(p_dev); 5 6 // LED 7 p_this->led_serv.p_next = NULL; 8 p_this->led_serv.p_servinfo = &p_par->led_servinfo; 371

385 9 p_this->led_serv.p_cookie = (void *)p_this; 10 p_this->led_serv.p_servfuncs = & g_led_servfuncs; *(struct awbl_led_service **)p_arg = &(p_this->led_serv); // LED 13 return AW_OK; 14 } Method AWBL_METHOD(awbl_ledserv_get, gpio_ledserv_get), // LED Method Method LED LED Method LED Method LED Method 1 AWBL_METHOD_IMPORT(awbl_ledserv_get); // LED Method 2 // Method 3 aw_local aw_const struct awbl_dev_method g_led_gpio_dev_methods[] = { 4 AWBL_METHOD(awbl_ledserv_get, gpio_ledserv_get), // LED Method 5 AWBL_METHOD_END // 6 }; g_led_gpio_dev_methods p_methods LED AWbus-lite LED GPIO LED PLB PLB awbl_plb_drvinfo_t awbl_plb_drvinfo_t awbl_plb.h 1 typedef struct awbl_plb_drvinfo{ 2 struct awbl_drvinfo super; // 3 } awbl_plb_drvinfo_t; LED LED 1 aw_local aw_const awbl_plb_drvinfo_t g_drvinfo_led_gpio = { 2 { 3 AWBL_VER_1, // AWBus-lite 4 AWBL_BUSID_PLB, // PLB 5 GPIO_LED_NAME, // 6 & g_awbl_drvfuncs_led_gpio, // 372

386 7 & g_led_gpio_dev_methods[0], // Method 8 NULL // 9 } 10 }; AWBus-lite aw_err_t awbl_drv_register(const struct awbl_drvinfo *p_drvinfo); p_drvinfo AW_OK -AW_ENOSPC -AW_ENOTSUP AWbus-lite awb_ver LED LED awbl_drv_register((struct awbl_drvinfo *)& g_drvinfo_led_gpio); g_drvinfo_led_gpio g_drvinfo_led_gpio struct awbl_drvinfo * LED g_drvinfo_led_gpio LED g_drvinfo_led_gpio LED LED 1 void awbl_led_gpio_drv_register(void) 2 { 3 awbl_drv_register((struct awbl_drvinfo *)& g_drvinfo_led_gpio); 4 } LED awbl_led_gpio_drv_register() aw_prj_config.c awbl_group_init() awbl_led_gpio_drv_register() static void awbl_group_init (void) 2 { 373

387 3 // #ifdef AW_DRV_AWBL_GPIO_LED 6 awbl_led_gpio_drv_register(); 7 #endif 8 9 // } AW_DRV_AWBL_GPIO_LED LED aw_prj_params.h LED AW_DEV_GPIO_LED GPIO LED AW_DRV_AWBL_GPIO_LED LED AW_DRV_AWBL_GPIO_LED aw_prj_params.h 1 #ifdef AW_DEV_GPIO_LED 2 #define AW_DRV_AWBL_GPIO_LED 3 #endif 13.4 LED AWbus-lite ZLG LED METHOD ZLG Method AWorks AWorks LED LED g_drvinfo_led_gpio

388 LED 7 Method LED 8 PCF85063 PCF AWorks RTC PCF85063 PCF85063 PCF85063 NXP / 13.3 SCL SDA I 2 C VDD VSS OSCI OSCO KHz PCF PCF85063 CLKOUT INT PCF85063 "pcf85063" #define AWBL_PCF85063_NAME "pcf85063" p_drvname AWBL_PCF85063_NAME PCF85063 I 2 C AWBL_BUSID_I2C PCF85063 RTC AWBL_DEVID_DEVICE bus_id AWBL_BUSID_I2C AWBL_DEVID_DEVICE AWBL_DEVID_DEVICE AWBL_BUSID_I2C AWBus-lite I 2 C struct awbl_i2c_device struct awbl_i2c_device 1 struct awbl_i2c_device { 2 struct awbl_dev super; // AWBus 3 }; struct awbl_i2c_device AWBus-lite 375

389 I 2 C PCF PCF typedef struct awbl_pcf85063_dev { 2 struct awbl_i2c_device super; // I 2 C device 3 // 4 } awbl_pcf85063_dev_t; PCF85063 AWBus-lite AWBus-lite 13.4 PCF PCF85063 PCF85063 RTC AWBus-lite RTC struct awbl_rtc_service RTC awbl_rtc.h 1 struct awbl_rtc_service { 2 struct awbl_rtc_service *p_next; // RTC 3 const struct awbl_rtc_servinfo *p_servinfo; // RTC 4 const struct awbl_rtc_servopts *p_servfuncs; // 5 void *p_cookie; // p_cookie 6 }; p_next RTC RTC p_servinfo RTC RTC RTC struct awbl_rtc_servinfo RTC awbl_rtc.h 1 struct awbl_rtc_servinfo { 2 int rtc_id; // RTC 3 }; RTC ID RTC ID RTC ID RTC ID RTC ID RTC p_servfuncs struct awbl_rtc_servopts RTC RTC awbl_rtc.h 1 struct awbl_rtc_servopts { 2 aw_err_t (*time_get)(void *p_cookie, aw_tm_t *p_tm); // RTC 3 aw_err_t (*time_set)(void *p_cookie, aw_tm_t *p_tm); // RTC 4 aw_err_t (*dev_ctrl)(void *p_cookie, int req, void *arg); // RTC 5 }; PCF85063 RTC RTC 376

390 p_cookie PCF85063 RTC RTC RTC RTC RTC RTC PCF PCF typedef struct awbl_pcf85063_dev { 2 struct awbl_i2c_device super; // I 2 C device 3 struct awbl_rtc_service rtc_serv; // RTC 4 } awbl_pcf85063_dev_t; PCF85063 PCF PCF85063 RTC RTC RTC p_servinfo RTC ID 13.56ID RTC ID PCF85063 RTC PCF PCF typedef struct awbl_pcf85063_devinfo { 2 struct awbl_rtc_servinfo rtc_servinfo; // RTC 3 // 4 } awbl_pcf85063_devinfo_t; PCF85063 I 2 C I 2 C addr PCF typedef struct awbl_pcf85063_devinfo { 2 struct awbl_rtc_servinfo rtc_servinfo; // RTC 3 uint8_t addr; // 4 } awbl_pcf85063_devinfo_t; p_busfuncs aw_local void pcf85063_inst_init1(awbl_dev_t *p_dev) 2 { 3 } 377

391 4 aw_local void pcf85063_inst_init2(awbl_dev_t *p_dev) 5 { 6 } 7 aw_local void pcf85063_inst_connect(awbl_dev_t *p_dev) 8 { 9 } 10 aw_local aw_const struct awbl_drvfuncs g_pcf85063_drvfuncs = { 11 pcf85063_inst_init1, 12 pcf85063_inst_init2, 13 pcf85063_inst_connect 14 }; g_pcf85063_drvfuncs p_busfuncs PCF85063 PCF85063 PCF85063 CLKOUT 13.8 CLKOUT 2control and status register2 0x01 bit2 ~ bit PCF CLKOUT Hz (Hz) PCF85063 I 2 C AWBus-lite I 2 C I 2 C I 2 C aw_err_t awbl_i2c_read(struct awbl_i2c_device uint16_t uint16_t uint32_t void size_t aw_err_t awbl_i2c_write(struct awbl_i2c_device uint16_t uint16_t uint32_t const void size_t *p_dev, flags, addr, subaddr, *p_buf, nbytes); *p_dev, flags, addr, subaddr, *p_buf, nbytes); I 2 C I 2 C 378

392 I 2 C 7.14 aw_ awbl_ AWBus-lite I 2 C struct awbl_i2c_device AWBus-lite AWBus-lite I 2 C aw_ I 2 C aw_i2c_mkdev() I 2 C aw_i2c_device_t AWBus-lite I 2 C AWbus-lite ID ID ID I 2 C PCF85063 I 2 C PCF85063PCF85063 struct awbl_i2c_device struct awbl_i2c_device AWBus-lite PCF85063 p_dev PCF85063 struct awbl_i2c_device I 2 C p_dev subaddrp_buf nbytes // flags addr I 2 C aw_i2c_mkdev() I 2 C aw_i2c_mkdev() 7.15 I 2 C 2 0x CLKOUT CLKOUT 1 aw_local void pcf85063_inst_init (awbl_dev_t *p_dev) 2 { 3 struct awbl_pcf85063_dev *p_this = (struct awbl_pcf85063_dev *)p_dev; 4 struct awbl_pcf85063_devinfo *p_devinfo = (struct awbl_pcf85063_devinfo *) 5 AWBL_DEVINFO_GET(p_dev) 6 uint8_t data[1]; 7 if (AW_OK!= awbl_i2c_read((struct awbl_i2c_device *)p_this, 8 AW_I2C_ADDR_7BIT AW_I2C_SUBADDR_1BYTE, 9 p_devinfo->addr, 10 0x01, // 11 data, 12 1)) { 13 return; 14 } 379

393 15 if ((data[0] & 0x07)!= 0x07) { // data[0] = 0x07; 17 awbl_i2c_write((struct awbl_i2c_device *)p_this, 18 AW_I2C_ADDR_7BIT AW_I2C_SUBADDR_1BYTE, 19 p_devinfo->addr, 20 0x01, // 21 data, 22 1); 23 } 24 } p_dev PCF85063 p_dev 0x PCF85063 I 2 C #define PCF85063_REG_CS2 0x01 // & /* */ 4 #define PCF85063_DEV_DECL(p_this, p_dev) struct awbl_pcf85063_dev *p_this = \ 5 (struct awbl_pcf85063_dev *)(p_dev) 6 7 /* */ 8 #define PCF85063_DEVINFO_DECL(p_devinfo, p_dev) struct awbl_pcf85063_devinfo *p_devinfo = \ 9 (struct awbl_pcf85063_devinfo *)AWBL_DEVINFO_GET(p_dev) aw_local void pcf85063_inst_connect(awbl_dev_t *p_dev) 12 { 13 PCF85063_DEV_DECL(p_this, p_dev); 14 PCF85063_DEVINFO_DECL(p_devinfo, p_this); 15 uint8_t data[1]; if (AW_OK!= awbl_i2c_read((struct awbl_i2c_device *)p_this, 18 AW_I2C_ADDR_7BIT AW_I2C_SUBADDR_1BYTE, 19 p_devinfo->addr, 20 PCF85063_REG_CS2, 21 data, 22 1)) { 23 return; 24 } if ((data[0] & 0x07)!= 0x07) { 380

394 27 data[0] = 0x07; 28 awbl_i2c_write((struct awbl_i2c_device *)p_this, 29 AW_I2C_ADDR_7BIT AW_I2C_SUBADDR_1BYTE, 30 p_devinfo->addr, 31 PCF85063_REG_CS2, 32 data, 33 1); 34 } 35 } p_dev PCF85063 RTC RTC rtc_serv struct awbl_rtc_service RTC awbl_rtc.h 1 struct awbl_rtc_service { 2 struct awbl_rtc_service *p_next; // RTC 3 const struct awbl_rtc_servinfo *p_servinfo; // RTC 4 const struct awbl_rtc_servopts *p_servfuncs; // 5 void *p_cookie; // p_cookie 6 }; 1 p_next p_next RTC RTC NULL p_next 1 PCF85063_DEV_DECL(p_this, p_dev); 2 p_this->rtc_serv.p_next = NULL; 2 p_servinfo p_servinfo RTC RTC rtc_servinfo p_servinfo 1 PCF85063_DEV_DECL(p_this, p_dev); 2 PCF85063_DEVINFO_DECL(p_devinfo, p_this); 3 p_this->rtc_serv.p_servinfo = &p_devinfo->rtc_servinfo; 3 p_servopts p_servopts RTC RTC struct awbl_rtc_servopts time_get 381

395 time_set dev_ctrl NULL RTC 1 aw_local aw_err_t pcf85063_time_get (void *p_cookie, aw_tm_t *p_tm) 2 { 3 // PCF85063 p_tm 4 return AW_OK; 5 } 6 7 aw_local aw_err_t pcf85063_time_set (void *p_cookie, aw_tm_t *p_tm) 8 { 9 // p_tm PCF return AW_OK; 11 } aw_local aw_const struct awbl_rtc_servopts g_pcf85063_servopts = { 14 pcf85063_time_get, 15 pcf85063_time_set, 16 NULL 17 }; g_pcf85063_servopts RTC p_servopts PCF x04 ~ 0x0A x ~ 59 0x ~ 59 0x ~ 23 0x ~ 31 0x ~ 6 0x ~ 12 0x0A 8 0 ~ 99 BCD

396 13.11 (Bit) PCF AWorks 24 PCF ~ ~ ~ ~ BCD ~ 99 BCD AWorks BCD aw_common.h 1 #define AW_BCD_TO_HEX(val) (((val) & 0x0f) + ((val) >> 4) * 10) // BCD 2 #define AW_HEX_TO_BCD(val) ((((val) / 10) << 4) + (val) % 10) // BCD p_tm #define PCF85063_REG_SEC 0x04 // 2 3 aw_local aw_err_t pcf85063_time_get (void *p_cookie, aw_tm_t *p_tm) 4 { 5 uint8_t data[7]; 6 PCF85063_DEV_DECL(p_this, p_cookie); 7 PCF85063_DEVINFO_DECL(p_devinfo, p_cookie); 8 if (AW_OK!= awbl_i2c_read((struct awbl_i2c_device *)p_this, 9 AW_I2C_ADDR_7BIT AW_I2C_SUBADDR_1BYTE, 383

397 10 p_devinfo->addr, 11 PCF85063_REG_SEC, 12 data, 13 7)) { 14 return -AW_EIO; 15 } 16 p_tm->tm_sec = AW_BCD_TO_HEX(data[0] & ~0x80); 17 p_tm->tm_min = AW_BCD_TO_HEX(data[1] & ~0x80); 18 p_tm->tm_hour = AW_BCD_TO_HEX(data[2] & ~0xC0); 19 p_tm->tm_mday = AW_BCD_TO_HEX(data[3] & ~0xC0); 20 p_tm->tm_mon = AW_BCD_TO_HEX(data[5] & ~0xE0) - 1; 21 p_tm->tm_year = AW_BCD_TO_HEX(data[6]); 22 if (p_tm->tm_year < 70) { 23 p_tm->tm_year += 100; 24 } 25 return AW_OK; 26 } p_cookie RTC p_cookie 7 BCD tm_year 1900 PCF ~ ~ 1999 tm_year 70 PCF tm_year ~ ~ ~ ~ ~ ~ PCF aw_local aw_err_t pcf85063_time_set (void *p_cookie, aw_tm_t *p_tm) 2 { 3 uint8_t data[7]; 4 5 PCF85063_DEV_DECL(p_this, p_cookie); 6 PCF85063_DEVINFO_DECL(p_devinfo, p_cookie); 7 8 data[0] = AW_HEX_TO_BCD(p_tm->tm_sec); 9 data[1] = AW_HEX_TO_BCD(p_tm->tm_min); 10 data[2] = AW_HEX_TO_BCD(p_tm->tm_hour); 11 data[3] = AW_HEX_TO_BCD(p_tm->tm_mday); 12 data[4] = AW_HEX_TO_BCD(p_tm->tm_wday); 13 data[5] = AW_HEX_TO_BCD(p_tm->tm_mon + 1); 384

398 14 data[6] = AW_HEX_TO_BCD(p_tm->tm_year % 100); if ((p_tm->tm_year < 70) (p_tm->tm_year > 170)) { 17 return AW_ETIME; 18 } if (awbl_i2c_write((struct awbl_i2c_device *)p_this, 21 AW_I2C_ADDR_7BIT AW_I2C_SUBADDR_1BYTE, 22 p_devinfo->addr, 23 PCF85063_REG_SEC, 24 data, 25 7)!= AW_OK) { 26 return -AW_EIO; 27 } return AW_OK; 30 } data tm_mon 0 ~ 11 PCF ~ 12 PCF tm_mon tm_year 70 ~ ~ 2069 tm_year 0 ~ ~ ~ ~ ~ tm_year p_cookie p_cookie p_cookie p_cookie RTC p_cookie p_cookie p_this RTC p_cookie p_this p_cookie 1 PCF85063_DEV_DECL(p_this, p_dev); 2 p_this->rtc_serv.p_cookie = (void *)p_this; RTC p_cookie RTC RTC Method RTC Method awbl_rtcserv_get PCF85063 RTC Method RTC

399 13.72 RTC 1 aw_local aw_err_t pcf85063_rtcserv_get (struct awbl_dev *p_dev, void *p_arg) 2 { 3 PCF85063_DEV_DECL(p_this, p_dev); 4 PCF85063_DEVINFO_DECL(p_devinfo, p_dev); 5 struct awbl_rtc_service *p_serv = &p_this->rtc_serv; 6 p_serv->p_next = NULL; 7 p_serv->p_servinfo = &p_devinfo->rtc_servinfo; 8 p_serv->p_servopts = & g_pcf85063_servopts; 9 p_serv->p_cookie = (void *)p_dev; 10 *(struct awbl_rtc_service **)p_arg = p_serv; 11 return AW_OK; 12 } Method AWBL_METHOD(awbl_rtcserv_get, pcf85063_rtcserv_get), // RTC Method Method PCF85063 RTC Method RTC Method PCF85063 Method 1 AWBL_METHOD_IMPORT(awbl_rtcserv_get); // RTC Method 2 // Method 3 aw_local aw_const struct awbl_dev_method g_pcf85063_dev_methods[] = { 4 AWBL_METHOD(awbl_rtcserv_get, pcf85063_rtcserv_get), // RTC Method 5 AWBL_METHOD_END // 6 }; g_pcf85063_dev_methods p_methods PCF85063 I 2 C I 2 C awbl_i2c_drvinfo_t awbl_i2c_drvinfo_t awbl_i2cbus.h 1 typedef struct awbl_i2c_drvinfo{ 2 struct awbl_drvinfo super; // 3 } awbl_i2c_drvinfo_t; PCF PCF aw_local aw_const awbl_i2c_drvinfo_t g_pcf85063_drv_registration = { 2 { 386

400 3 AWBL_VER_1, // AWBus-lite 4 AWBL_BUSID_I2C, // I 2 C 5 AWBL_PCF85063_NAME, // 6 & g_pcf85063_drvfuncs, // 7 & g_pcf85063_dev_methods[0], // Method 8 NULL // 9 } 10 }; PCF PCF void awbl_pcf85063_drv_register (void) 2 { 3 awbl_drv_register((struct awbl_drvinfo *)& g_pcf85063_drv_registration); 4 } PCF PCF85063 awbl_pcf85063.h 1 #ifndef AWBL_PCF85063_H 2 #define AWBL_PCF85063_H 3 4 #ifdef cplusplus 5 extern "C" { 6 #endif 7 8 #include "awbl_rtc.h" 9 #include "awbl_i2cbus.h" #define AWBL_PCF85063_NAME "pcf85063" // PCF /* PCF85063 */ 14 typedef struct awbl_pcf85063_devinfo { 15 struct awbl_rtc_servinfo rtc_servinfo; // RTC 16 uint8_t addr; // 17 } awbl_pcf85063_devinfo_t; /* PCF85063 */ 20 typedef struct awbl_pcf85063_dev { 21 struct awbl_i2c_device super; // AWBus I 2 C device 22 struct awbl_rtc_service rtc_serv; // RTC 23 } awbl_pcf85063_dev_t; /* PCF85063 */ 387

401 26 void awbl_pcf85063_drv_register (void); #ifdef cplusplus 29 } 30 #endif #endif PCF85063 awbl_pcf85063.c 1 #include "apollo.h" 2 #include "awbus_lite.h" 3 #include "awbl_i2cbus.h" 4 #include "awbl_rtc.h" 5 #include "driver/rtc/awbl_pcf85063.h" 6 #include "time.h" 7 8 #define PCF85063_REG_CS2 0x01 // & 2 9 #define PCF85063_REG_SEC 0x04 // /* */ 12 #define PCF85063_DEV_DECL(p_this, p_dev) struct awbl_pcf85063_dev *p_this = \ 13 (struct awbl_pcf85063_dev *)(p_dev) /* */ 16 #define PCF85063_DEVINFO_DECL(p_devinfo, p_dev) struct awbl_pcf85063_devinfo *p_devinfo = \ 17 (struct awbl_pcf85063_devinfo *)AWBL_DEVINFO_GET(p_dev) aw_local aw_err_t pcf85063_time_get (void *p_cookie, aw_tm_t *p_tm) 20 { 21 uint8_t data[7]; 22 PCF85063_DEV_DECL(p_this, p_cookie); 23 PCF85063_DEVINFO_DECL(p_devinfo, p_cookie); 24 if (AW_OK!= awbl_i2c_read((struct awbl_i2c_device *)p_this, 25 AW_I2C_ADDR_7BIT AW_I2C_SUBADDR_1BYTE, 26 p_devinfo->addr, 27 PCF85063_REG_SEC, 28 data, 29 7)) { 30 return -AW_EIO; 31 } 32 p_tm->tm_sec = AW_BCD_TO_HEX(data[0] & ~0x80); 33 p_tm->tm_min = AW_BCD_TO_HEX(data[1] & ~0x80); 34 p_tm->tm_hour = AW_BCD_TO_HEX(data[2] & ~0xC0); 35 p_tm->tm_mday = AW_BCD_TO_HEX(data[3] & ~0xC0); 388

402 36 p_tm->tm_mon = AW_BCD_TO_HEX(data[5] & ~0xE0) - 1; 37 p_tm->tm_year = AW_BCD_TO_HEX(data[6]); if (p_tm->tm_year < 70) { 40 p_tm->tm_year += 100; 41 } 42 return AW_OK; 43 } aw_local aw_err_t pcf85063_time_set (void *p_cookie, aw_tm_t *p_tm) 46 { 47 uint8_t data[7]; 48 PCF85063_DEV_DECL(p_this, p_cookie); 49 PCF85063_DEVINFO_DECL(p_devinfo, p_cookie); 50 data[0] = AW_HEX_TO_BCD(p_tm->tm_sec); 51 data[1] = AW_HEX_TO_BCD(p_tm->tm_min); 52 data[2] = AW_HEX_TO_BCD(p_tm->tm_hour); 53 data[3] = AW_HEX_TO_BCD(p_tm->tm_mday); 54 data[4] = AW_HEX_TO_BCD(p_tm->tm_wday); 55 data[5] = AW_HEX_TO_BCD(p_tm->tm_mon + 1); 56 data[6] = AW_HEX_TO_BCD(p_tm->tm_year % 100); if ((p_tm->tm_year < 70) (p_tm->tm_year > 170)) { 59 return AW_ETIME; 60 } if (awbl_i2c_write((struct awbl_i2c_device *)p_this, 63 AW_I2C_ADDR_7BIT AW_I2C_SUBADDR_1BYTE, 64 p_devinfo->addr, 65 PCF85063_REG_SEC, 66 data, 67 7)!= AW_OK) { 68 return -AW_EIO; 69 } return AW_OK; 72 } aw_local void pcf85063_inst_init1(awbl_dev_t *p_dev) 75 { 76 } aw_local void pcf85063_inst_init2(awbl_dev_t *p_dev) 79 { 389

403 80 } aw_local void pcf85063_inst_connect(awbl_dev_t *p_dev) 83 { 84 PCF85063_DEV_DECL(p_this, p_dev); 85 PCF85063_DEVINFO_DECL(p_devinfo, p_this); 86 uint8_t data[1]; if (AW_OK!= awbl_i2c_read((struct awbl_i2c_device *)p_this, 89 AW_I2C_ADDR_7BIT AW_I2C_SUBADDR_1BYTE, 90 p_devinfo->addr, 91 PCF85063_REG_CS2, 92 data, 93 1)) { 94 return; 95 } 96 if ((data[0] & 0x07)!= 0x07) { 97 data[0] = 0x07; 98 awbl_i2c_write((struct awbl_i2c_device *)p_this, 99 AW_I2C_ADDR_7BIT AW_I2C_SUBADDR_1BYTE, 100 p_devinfo->addr, 101 PCF85063_REG_CS2, 102 data, 103 1); 104 } 105 } /* Method Handler RTC */ 108 aw_local aw_err_t pcf85063_rtcserv_get (struct awbl_dev *p_dev, void *p_arg) 109 { 110 PCF85063_DEV_DECL(p_this, p_dev); 111 PCF85063_DEVINFO_DECL(p_devinfo, p_dev); 112 struct awbl_rtc_service *p_serv = &p_this->rtc_serv; p_serv->p_next = NULL; 115 p_serv->p_servinfo = &p_devinfo->rtc_servinfo; 116 p_serv->p_servopts = & g_pcf85063_servopts; 117 p_serv->p_cookie = (void *)p_dev; *(struct awbl_rtc_service **)p_arg = p_serv; 120 return AW_OK; 121 } 122 aw_local aw_const struct awbl_drvfuncs g_pcf85063_drvfuncs = { 123 pcf85063_inst_init1, 390

404 124 pcf85063_inst_init2, 125 pcf85063_inst_connect 126 }; aw_local aw_const struct awbl_rtc_servopts g_pcf85063_servopts = { 129 pcf85063_time_get, 130 pcf85063_time_set, 131 NULL 132 }; AWBL_METHOD_IMPORT(awbl_rtcserv_get); 135 aw_local aw_const struct awbl_dev_method g_pcf85063_dev_methods[] = { 136 AWBL_METHOD(awbl_rtcserv_get, pcf85063_rtcserv_get), 137 AWBL_METHOD_END 138 }; aw_local aw_const awbl_i2c_drvinfo_t g_pcf85063_drv_registration = { 141 { 142 AWBL_VER_1, // AWBus-lite 143 AWBL_BUSID_I2C, // I 2 C 144 AWBL_PCF85063_NAME, // 145 & g_pcf85063_drvfuncs, // 146 & g_pcf85063_dev_methods[0], // Method 147 NULL // 148 } 149 }; void awbl_pcf85063_drv_register (void) 152 { 153 awbl_drv_register((struct awbl_drvinfo *)& g_pcf85063_drv_registration); 154 } 391

405 TPS0xR/T TPS0xR/T ZLG TPS0xR/T I 2 C SPIPT TPS0xR/T TPS02R TPS08R TPS02T TPS08T PT100 JKTENRSB -200~ ~ %T %fs 1 ADC / 6.25 / 12.5 / 12.5 / 2Hz 2Hz 2Hz 2Hz 1mA 1mA V 3.3V 3.3V 3.3V 0.3W 0.5W 0.3W 0.5W 2500VAC 2500VAC 2500VAC 2500VAC I 2 C SPI I 2 C SPI 3.3V 3.3V 3.3V 3.3V -40~+85-40~+85-40~+85-40~+85 DIP16 DIP24 DIP16 DIP24 mm

406 14.2 TPS0xT J -200 ~ ~ %T0.5 0 ~ %T0.5 K -200 ~ ~ %T0.5 0 ~ %T0.5 T -250 ~ ~ %T0.5 0 ~ %T0.5 E -200 ~ ~ %T0.5 0 ~ %T0.5 N -200 ~ ~ 0 0.7%T0.7 0 ~ %T0.7 R 0 ~ %T1 S 0 ~ %T1 B 400 ~ %T1 AWorks TPS0xR/T TPS02R AWorks TPS02R TPS02R PT100 I 2 C 1 TPS02R PT100 I 2 C -200 ~ %T VRMS -40 ~ V 2500VRMS 14.1 TPS02R 2 TPS02R TPS02R 1 VCC 3.3V 2 GND 3 SCL I 2 C 4 SDA I 2 C 5 A0 I 2 C (0x48) VCC (0x49) 6 ALERT 7 RA1 PT100 1 A 8 RB1 PT100 1 B 393

407 9 RC1 PT100 1 C 10 RA2 PT100 2 A 11 RB2 PT100 2 B 12 RC2 PT100 2 C TPS02R I 2 C I 2 C A0#5 7 I 2 C 0x48 VCC 0x49 TPS02R ALERT ALERT 3 TPS02R RA1RB1 RC1 1 RA2 RB2 RC RA1RB1 RC1 PT RA2RB2 RC2 14.2a b RA1RB1 RC1 PT100 RA2RB2 RC2 PT100 A0 7 I 2 C 0x TPS02R 14.3 AWbus-lite AWorks AWbus-lite 12.1 struct awbl_devhcf

408 14.1 struct awbl_devhcf awbus_lite.h 1 struct awbl_devhcf { 2 const char *p_name; // 3 uint8_t unit; // 4 uint8_t bus_type; // 5 uint8_t bus_index; // 6 struct awbl_dev *p_dev; // 7 const void *p_devinfo; // () 8 }; 1 TPS02R awbl_tps02r.h TPS02R awbl_tps02r.h 1 #define AWBL_TPS02R_NAME "awbl_tps02r" AWBL_TPS02R_NAME 2 TPS02R 0 3 TPS02R I 2 C I 2 C AWBL_BUSID_I2C 4 TPS02R I 2 C I 2 C I 2 C aw_prj_params.h i.mx28x 3 I 2 C I 2 C0I 2 C1 GPIO I 2 C I 2 C 1 #define IMX28_I2C0_BUSID 0 // I 2 C0 2 #define IMX28_I2C1_BUSID 1 // I 2 C1 3 #define GPIO_I2C0_BUSID 2 // GPIO I 2 C0 TPS02R GPIO I 2 C0 GPIO_I2C0_BUSID 5 awbl_tps02r.h TPS02R struct awbl_tps02r_dev TPS02R struct awbl_tps02r_dev g_tps02r_dev_0; g_tps02r_dev_0 p_dev 395

409 6 awbl_tps02r.h TPS02R struct awbl_tps02r_devinfo struct awbl_tps02r_devinfo 1 struct awbl_tps02r_devinfo { 2 int start_id; /* id */ 3 int alert_pin; /* */ 4 uint8_t i2c_addr; /* I 2 C 7 */ 5 }; start_id TPS02R id id TPS02R 2 PT100 1 PT100 2 id TPS02R 2 ID start_id (start_id+1) start_id 1 TPS02R ID 1 2 ID id id aw_pri_params.h TPS02R 2 id #define SENSOR_TPS02R_0_START_ID 1 /* 2 12 ID */ start_id SENSOR_TPS02R_0_START_ID id alert_pin TPS02R ALERT TPS02R ALERT TPS02R ALERT i.mx28x PIO2_14 TPS02R ALERT alert_pin PIO2_14 alert_pin -1 i2c_addr TPS02R 7 I 2 C TPS02R A0 GND 0x48 i2c_addr 0x TPS02R 1 aw_local aw_const struct awbl_tps02r_devinfo g_tps02r_devinfo_0 = { 2 SENSOR_TPS02R_0_START_ID, 3 PIO2_14, 4 0x48 5 }; TPS02R TPS02R awbl_hwconf_tps02r_0.h 1 #ifdef AW_DEV_EXTEND_TPS02R_0 396

410 2 3 #include "driver/sensor/awbl_tps02r.h" 4 5 /* TPS02R */ 6 aw_local aw_const struct awbl_tps02r_devinfo g_tps02r_devinfo_0 = { 7 SENSOR_TPS02R_0_START_ID, 8 PIO2_14, 9 0x48 10 }; /* TPS02R */ 13 aw_local struct awbl_tps02r_dev g_tps02r_dev_0; #define AWBL_HWCONF_TPS02R_0 \ 16 { \ 17 AWBL_TPS02R_NAME, \ 18 0, \ 19 AWBL_BUSID_I2C, \ 20 GPIO_I2C0_BUSID, \ 21 (struct awbl_dev *)& g_tps02r_dev_0, \ 22 & g_tps02r_devinfo_0 \ 23 }, 24 #else 25 #define AWBL_HWCONF_TPS02R_0 26 #endif AWBL_HWCONF_TPS02R_0 AW_DEV_EXTEND_TPS02R_0 AWBL_HWCONF_TPS02R_ aw_const struct awbl_devhcf g_awbl_devhcf_list[] = { // 2 //... 3 AWBL_HWCONF_TPS02R_0 // TPS02R 4 //... 5 }; AWBL_HWCONF_TPS02R_0 awbl_hwconf_tps02r_0.h TPS02R TPS02R TPS02R TPS02R id SENSOR_TPS02R_0_START_ID 1TPS02R

411 14.4 TPS02R id 1 ID AW_SENSOR_TYPE_TEMPERATURE TPS02R 1 2 AW_SENSOR_TYPE_TEMPERATURE TPS02R id 1 2 TPS02R 1id 1 2id TPS02R 1 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_sensor.h" 5 6 int aw_main (void) 7 { 8 const int id[2] = {1, 2}; // aw_sensor_val_t buf[2]; // 2 10 int i; aw_sensor_group_enable(id, 2, buf); 13 while(1) { 14 aw_sensor_group_data_get(id, 2, buf); 15 for (i = 0; i < 2; i++) { 16 if (AW_SENSOR_VAL_IS_VALID(buf[i])) { // 17 // AW_SENSOR_UNIT_MICRO 6 18 aw_sensor_val_unit_convert(&buf[i], 1, AW_SENSOR_UNIT_MICRO); 19 aw_kprintf("the temp of chan %d is : %d.%06d \r\n", id[i], 20 (buf[i].val)/ , 21 (buf[i].val)% ); 22 } else { // 23 aw_kprintf("the temp of chan id %d get failed!\r\n", id[i]); 24 } 25 } 26 aw_mdelay(1000); 27 } 28 } TPS02R AW_SENSOR_UNIT_MICRO EMM400x EMM400x ZLG EMM400x

412 14.5 EMM400x EMM400A EMM400B ~260Vrms2%fs 0~260Vrms0.1%fs 0.010~1.5Arms2%fs 0~1.5Arms0.1%fs 0.8~390W2%fs 0.8~390W0.2%fs 2% 0.2% ADC / 20 / 3.3V 3.3V 0.2W 0.35W 2500VAC 2500VAC UART UART 3.3V 3.3V -40~+85-40~+85 DIP10 DIP mm mm AWorks EMM400x EMM400A AWorks EMM400A EMM400A ZLG DC-DC 2% 2500V PCB bps 80~260Vrms 2% 0.010~1.5Arms 2% 0.8~390W 2% 0.06W 2500VDC -40~ EMM400A 2 EMM400 DIP

413 14.6 EMM400A 1 AC N 2 AC R 4 AC L 6 DGND 7 TX UART 8 VCC 3.3V 3 EMM400A MCU RX 8 3.3V 14.5 EMM400A EN mmPCB 4 EMM400 EMM bps8 1 1 EMM400 50ms CF EMM400 0x55 0x5A 1 0x x5A D3 70 0x02D

414 CF EMM400 1 a 2 VX * Vt 3 S X X V P I V a 4 PX * Pt Pr PS PX 6 P Ix AIa It Vx VVa Vt Ps VA Ix Vx Px WPa Pt Pr Var Ps PX E kwhn EMM400 F Pa AWorks EMM

415 EMM400 AWorks AWBus-lite AWBus-lite 6 1 EMM400 EMM400 awbl_emm400.h EMM400 awbl_emm400.h 1 #define AWBL_EMM400_NAME "awbl_emm400" AWBL_EMM400_NAME 2 EMM EMM400 EMM400 CPU PLB bus_type AWBL_BUSID_PLB 4 EMM400 PLB PLB bus_index 0 5 awbl_emm400.h EMM400 struct awbl_emm400_dev EMM400 1 struct awbl_emm400_dev g_emm400_dev0; g_emm400_dev0 p_dev 6 awbl_emm400.h EMM400 awbl_emm400_devinfo_t awbl_emm400.h 1 typedef struct awbl_emm400_devinfo { 2 int start_id; // ID 3 int com_id; // COM ID 4 } awbl_emm400_devinfo_t; start_id EMM400A idemm400 6 id 6 idemm400 id start_id ~ (start_id + 6-1)start_id 3 id 3 ~ 8 id id aw_pri_params.h EMM400 6 id 402

416 #define SENSOR_EMM400_0_START_ID 3 // EMM ~ 8 start_id SENSOR_EMM400_0_START_ID id com_id EMM400 aw_prj_params.h i.mx28x #define IMX28_DUART_COMID COM0 2 #define IMX28_AUART0_COMID COM1 3 #define IMX28_AUART1_COMID COM2 4 #define IMX28_AUART2_COMID COM3 5 #define IMX28_AUART3_COMID COM4 6 #define IMX28_AUART4_COMID COM5 AUART0 EMM400 com_id IMX28_AUART0_COMID EMM400 1 aw_local aw_const awbl_emm400_devinfo_t g_emm400_dev0info = { 2 SENSOR_EMM400_0_START_ID, 3 IMX28_AUART0_COMID 4 }; EMM EMM400 awbl_hwconf_emm400_0.h 1 #ifndef AWBL_HWCONF_EMM400_0_H 2 #define AWBL_HWCONF_EMM400_0_H 3 4 #ifdef AW_DEV_EXTEND_EMM400_0 5 6 #include "driver/energy/awbl_emm400.h" 7 8 /* emm400 */ 9 aw_local aw_const awbl_emm400_devinfo_t g_emm400_dev0info = { 10 SENSOR_EMM400_0_START_ID, 11 IMX28_AUART0_COMID 12 }; /* emm400 */ 15 aw_local awbl_emm400_dev_t g_emm400_dev0; #define AWBL_HWCONF_EMM400_0 \ 403

417 18 { \ 19 AWBL_EMM400_NAME, \ 20 0, \ 21 AWBL_BUSID_PLB, \ 22 0, \ 23 &( g_emm400_dev0.dev), \ 24 & g_emm400_dev0info \ 25 }, 26 #else 27 #define AWBL_HWCONF_EMM400_0 28 #endif #endif AWBL_HWCONF_EMM400_0 AW_DEV_EXTEND_EMM400_0 AWBL_HWCONF_EMM400_ aw_const struct awbl_devhcf g_awbl_devhcf_list[] = { // 2 //... 3 AWBL_HWCONF_EMM400_0 // EMM400 4 //... 5 }; AWBL_HWCONF_EMM400_0 awbl_hwconf_emm400_0.h EMM400 EMM400 6 EMM400 EMM400 id SENSOR_EMM400_0_START_ID 3EMM EMM400 id 3 ID AW_SENSOR_TYPE_VOLTAGE EMM400 4 AW_SENSOR_TYPE_CURRENT EMM400 5 AW_SENSOR_TYPE_POWER EMM400 6 AW_SENSOR_TYPE_POWER EMM400 7 AW_SENSOR_TYPE_POWER EMM400 8 AW_SENSOR_TYPE_ELECTRIC_CONSUMPTION EMM id 3 ~ 8 404

418 EMM400 1 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_sensor.h" 5 6 int aw_main (void) 7 { 8 const int id[6] = {3, 4, 5, 6, 7, 8}; // 6 3 ~ 8 9 aw_sensor_val_t buf[6]; // 6 10 int i; /* 13 * 6 14 * 15 */ 16 const char *data_name_string[] = {"voltage", "current", "apparent power", 17 "active power", "reactive power", "electricity consumption"}; 18 const char *data_unit_string[] = {"V", "A", "VA", "W", "Var", "kwh"}; aw_sensor_group_enable(id, 6, buf); 21 while(1) { 22 aw_sensor_group_data_get(id, 6, buf); 23 for (i = 0; i < 6; i++) { 24 if (AW_SENSOR_VAL_IS_VALID(buf[i])) { // 25 // AW_SENSOR_UNIT_MICRO 6 26 aw_sensor_val_unit_convert(&buf[i], 1, AW_SENSOR_UNIT_MICRO); 27 aw_kprintf("the %s is : %d.%06d %s.\r\n", data_name_string[i], 28 (buf[i].val)/ , 29 (buf[i].val)% , 30 data_unit_string[i]); 31 } else { // 32 aw_kprintf("the %s get failed! \r\n", data_name_string[i]); 33 } 34 } 35 aw_mdelay(1000); 36 } 37 } 14.3 TPS0xU TPS0xU ZLG 24 ADC 4~20mA/0~5V TPS0xU 405

419 I 2 C SPI TPS0xU TPS02U TPS08U 2 8 4~20mA 4~20mA 0~5V 0~5V 0.1%fs 0.1%fs / 12.5 / 1G 1G 13Hz 13Hz 3.3V 3.3V 0.35W 0.46W 2500VAC 2500VAC I 2 C SPI 3.3V 3.3V -40~+85-40~+85 DIP16 DIP mm mm AWorks TPS0xU TPS08U AWorks TPS08U TPS08U 8 0~5V 0.1%5mV 4~20mA 0.1% sigma-delta 24bit ADCTPS08U 12.5sps 6.25sps SPI 1 0~5V 0.1%5mV 4~20mA 0.1% 4KV 8KV 2500V AC -40~+85 SPI I/O 14.6 TPS08U 406

420 2 TPS08U VDD 3.3V 2 DGND 3 CS 4 VCC 5.2V CH1_A ~ CH8_A CH1_B ~ CH8_B 21 IGND DGND 22 SCLK SPI 23 MOSI SPI 24 MISO SPI 3 TPS08U MR 14.7 TPS08U TPS08U 8 CH1 ~ CH8 8 4 CH1 CH2CH3 CH4CH5 CH6CH7 CH TPS08U AWorks AWBus-lite AWBus-lite 6 1 TPS08U awbl_tps08u.h

421 14.18 TPS08U 1 #define AWBL_TPS08U_NAME "awbl_tps08u" AWBL_TPS08U_NAME 2 TPS08U 0 3 TPS08U SPI SPI AWBL_BUSID_SPI 4 TPS08U SPI SPI SPI aw_prj_params.h i.mx28x 5 SPI SSP0 ~ SSP3GPIO SPI SPI 1 #define IMX28_SSP0_BUSID 0 2 #define IMX28_SSP1_BUSID 1 3 #define IMX28_SSP2_BUSID 2 4 #define IMX28_SSP3_BUSID 3 5 #define GPIO_SPI0_BUSID 4 TPS08U SSP0 IMX28_SSP0_BUSID 5 awbl_tps08u.h TPS08U struct awbl_tps08u_dev TPS08U 1 struct awbl_tps08u_dev g_tps08u_dev; g_tps08u_dev p_dev 6 awbl_tps08u.h TPS08U struct awbl_tps08u_devinfo struct awbl_tps08u_devinfo 1 struct awbl_sensor_tps08u_devinfo { 2 int start_id; /* ID */ 3 uint32_t sclk_freq; /* SPI */ 4 int cs_pin; /* SPI */ 5 uint8_t chan_mode; /* */ 6 }; start_id TPS08U idtps08u 408

422 8 chan_mode id 8 idtps08u id start_id ~ (start_id + 8-1)start_id 9 id 9 ~ 16 id id aw_pri_params.h TPS08U 8 id 1 #define SENSOR_TPS08U_0_START_ID 9 // TPS08U 8 9 ~ 16 start_id SENSOR_TPS08U_0_START_ID id sclk_freq SPI HzTPS08U 6MHz SPI sclk_freq cs_pin TPS08U i.mx28x PIO2_27 TPS08U cs_pin PIO2_27TPS08U 4 SPI chan_mode TPS08U 8 CH1 ~ CH8 4 CH1 CH2CH3 CH4CH5 CH6CH7 CH8 AWBL_TPS08U_MODE_CHx_y_Vxy y x+1 CH1 CH2 AWBL_TPS08U_MODE_CH1_2_V AWBL_TPS08U_MODE_CHx_y_CCH1 CH2 AWBL_TPS08U_MODE_CH1_2_Cchan_mode 4 C TPS08U 1 CH1CH2 2 CH3CH4 3 CH5CH6 4 CH7CH8 AWBL_TPS08U_MODE_CH1_2_V AWBL_TPS08U_MODE_CH1_2_C AWBL_TPS08U_MODE_CH3_4_V AWBL_TPS08U_MODE_CH3_4_C AWBL_TPS08U_MODE_CH5_6_V AWBL_TPS08U_MODE_CH5_6_C AWBL_TPS08U_MODE_CH7_8_V AWBL_TPS08U_MODE_CH7_8_C 2 CH1 ~ CH4 2 CH5 ~ CH8 chan_mode AWBL_TPS08U_MODE_CH1_2_V AWBL_TPS08U_MODE_CH3_4_V \ AWBL_TPS08U_MODE_CH5_6_C AWBL_TPS08U_MODE_CH7_8_C AWBL_TPS08U_MODE_CH1_2_V AWBL_TPS08U_MODE_CH1_2_C 409

423 TPS08U 1 aw_local aw_const struct awbl_tps08u_devinfo g_tps08u_devinfo = { 2 SENSOR_TPS08U_0_START_ID, , 4 PIO2_27, 5 AWBL_TPS08U_MODE_CH1_2_V AWBL_TPS08U_MODE_CH3_4_V \ 6 AWBL_TPS08U_MODE_CH5_6_C AWBL_TPS08U_MODE_CH7_8_C 7 }; TPS08U TPS08U awbl_hwconf_tps08u_0.h 1 #ifndef AWBL_HWCONF_TPS08U_0_H 2 #define AWBL_HWCONF_TPS08U_0_H 3 4 #ifdef AW_DEV_TPS08U_0 5 6 #include "driver/sensor/awbl_tps08u.h" 7 #include "aw_spi.h" 8 #include "aw_gpio.h" 9 10 aw_local aw_const struct awbl_tps08u_devinfo g_tps08u_devinfo = { /* TPS08U */ 11 SENSOR_TPS08U_0_START_ID, , 13 PIO2_27, 14 AWBL_TPS08U_MODE_CH1_2_V AWBL_TPS08U_MODE_CH3_4_V \ 15 AWBL_TPS08U_MODE_CH5_6_C AWBL_TPS08U_MODE_CH7_8_C 16 }; aw_local struct awbl_tps08u_dev g_tps08u_dev; /* TPS08U */ #define AWBL_HWCONF_TPS08U_0 \ 21 { \ 22 AWBL_TPS08U_NAME, \ 23 0, \ 24 AWBL_BUSID_SPI, \ 25 IMX28_SSP0_BUSID, \ 26 & g_tps08u_dev.dev, \ 27 & g_tps08u_devinfo \ 28 }, 29 #else 410

424 30 #define AWBL_HWCONF_TPS08U_0 31 #endif #endif AWBL_HWCONF_TPS08U_0 AW_DEV_TPS08U_0 AWBL_HWCONF_TPS08U_ aw_const struct awbl_devhcf g_awbl_devhcf_list[] = { /* */ 2 /*... */ 3 AWBL_HWCONF_TPS08U_0 /* TPS08U */ 4 /*... */ 5 }; AWBL_HWCONF_TPS08U_0 awbl_hwconf_tps08u_0.h TPS08U TPS08U 8 TPS08U TPS08U id SENSOR_TPS08U_0_START_ID CH1 ~ CH4 2 CH4 ~ CH8TPS08U TPS08U id 9 ID AW_SENSOR_TYPE_VOLTAGE TPS08U CH1 10 AW_SENSOR_TYPE_VOLTAGE TPS08U CH2 11 AW_SENSOR_TYPE_VOLTAGE TPS08U CH3 12 AW_SENSOR_TYPE_VOLTAGE TPS08U CH4 13 AW_SENSOR_TYPE_CURRENT TPS08U CH5 14 AW_SENSOR_TYPE_CURRENT TPS08U CH6 15 AW_SENSOR_TYPE_CURRENT TPS08U CH7 16 AW_SENSOR_TYPE_CURRENT TPS08U CH8 6.6 id 9 ~ TPS08U 1 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 411

425 4 #include "aw_sensor.h" 5 6 int aw_main (void) 7 { 8 const int id[8] = {9, 10, 11, 12, 13, 14, 15, 16}; // 8 9 ~ 16 9 aw_sensor_val_t buf[8]; // 8 10 int i; aw_sensor_group_enable(id, 8, buf); 13 while(1) { 14 aw_sensor_group_data_get(id, 8, buf); 15 for (i = 0; i < 4; i++) { // 4 16 if (AW_SENSOR_VAL_IS_VALID(buf[i])) { 17 // AW_SENSOR_UNIT_MICRO 6 18 aw_sensor_val_unit_convert(&buf[i], 1, AW_SENSOR_UNIT_MICRO); 19 aw_kprintf("the voltage of chan %d is : %d.%06d V.\r\n", id[i], 20 (buf[i].val)/ , 21 (buf[i].val)% ); 22 } else { 23 aw_kprintf("the voltage of chan %d get failed! \r\n", id[i]); 24 } 25 } 26 for (i = 4; i < 8; i++) { // 4 27 if (AW_SENSOR_VAL_IS_VALID(buf[i])) { 28 aw_sensor_val_unit_convert(&buf[i], 1, AW_SENSOR_UNIT_MICRO); 29 aw_kprintf("the current of chan %d is : %d.%06d A.\r\n", id[i], 30 (buf[i].val)/ , 31 (buf[i].val)% ); 32 } else { 33 aw_kprintf("the current of chan %d get failed! \r\n", id[i]); 34 } 35 } 36 aw_mdelay(1000); 37 } 38 } 14.4 RTM11AT RTM11AT SPI 485 RS-485 DC-DC 1 SPI SPI RS-485 SPI RS RTM11AT 412

426 RS-485 UART UART 0 1 UART MCU MCU UART MCU UART TTL MCU 1 0 UART Wi-Fi Wi-Fi RS-485 TTL MCU TTL RS-485 MCU RS485 UART RS RS-485 AB RS-485 AB UART TX RX RS-485 DIR TX RX RS-485 RS-485 AB A B RS

427 RTM11AT RS-485 RTM11AT RS RTM11AT 1 SPI RS-485 RS-485 TIA/EIA RS kbps 1 SPI 5Mbit/s 2500VDC -40~+85 EME EMS 2 RTM11AT SPI 0 MOSI#5 MISO#6CLK#4CS#7 RS-485 1A1#14 B1#15 RS-485 2A2#10 B2#11 RESET# RTM11AT RTM11AT INT#8 INT VCC(#1) GND(#2)VO1 VO2 G1 G2 RTM11AT RS-485 RS485 RS-485 RS A/B ESD ESD

428 SPI NUP4202W1T2G A/B TVS C1C2 1022KV1206 T1T2 B82793S0513N201 R1R2 1MΩ1206 TVS3TVS6 SMBJ12CA R3R4 120Ω1206 TVS1TVS2TVS4TVS5 SMBJ6.5CA GDT1GDT2 B3D090L R R U1 RTM U2 NUP4202W1T2G RTM11AT AWorks AWBus-lite RS-485 MCU UART RS-485 UART 415

429 RS-485 AWorks RS-485 RTM11AT 1 SPI 2 RS-485 AWBus-lite RTM11AT AWBus-lite MCU aw_serial_write() COM RTM11AT COMx COMy RTM11AT RTM11AT AWBus-lite 6 1 RTM11AT awbl_rtm11at.h RTM11AT awbl_rtm11at.h #define AWBL_RTM11AT_NAME "awbl_rtm11at" AWBL_RTM11AT_NAME 2 RTM11AT 0 3 RTM11AT SPI SPI AWBL_BUSID_SPI 4 RTM11AT SPI SPI SPI aw_prj_params.h i.mx28x 5 SPI SSP0SSP1SSP2SSP3 GPIO SPI

430 14.27 SPI 1 #define IMX28_SSP0_BUSID 0 2 #define IMX28_SSP1_BUSID 1 3 #define IMX28_SSP2_BUSID 2 4 #define IMX28_SSP3_BUSID 3 5 #define GPIO_SPI0_BUSID 4 RTM11AT SSP2 IMX28_SSP2_BUSID 5 awbl_rtm11at.h RTM11AT struct awbl_rtm11at_dev RTM11AT struct awbl_rtm11at_dev g_rtm11at_0_dev; g_rtm11at_0_dev p_dev 6 awbl_rtm11at.h RTM11AT struct awbl_rtm11at_devinfo struct awbl_rtm11at_devinfo 1 struct awbl_rtm11at_devinfo { 2 uint8_t uart_comid[2]; /* ID */ 3 uint32_t uart_base_clk; /* */ 4 uint32_t speed_hz; /* SPI */ 5 int cs_pin; /* RTM11AT */ 6 int int_pin; /* RTM11AT */ 7 int reset_pin; /* RTM11AT */ 8 }; uart_comid[2] ID RTM11AT 1 SPI 2 RS-485 RTM11AT RTM11AT ID i.mx28x 6 COM0 ~ COM5 6 ID RTM11AT ID COM6 COM ID aw_prj_params.h 1 #define IMX28_DUART_COMID COM0 2 #define IMX28_AUART0_COMID COM1 3 #define IMX28_AUART1_COMID COM2 4 #define IMX28_AUART2_COMID COM3 5 #define IMX28_AUART3_COMID COM4 6 #define IMX28_AUART4_COMID COM5 7 #define RTM11AT_UART0_COMID COM6 8 #define RTM11AT_UART1_COMID COM7 417

431 uart_comid RTM11AT_UART0_COMID RTM11AT_UART1_COMID uart_base_clk Hz ~ RTM11AT uart_base_clk = = = RTM11AT 500kbps = k250k125k speed_hz SPI RTM11AT 5MHz SPI 2MHz cs_pin RTM11AT CS PIO2_19 CS spi_cs_pin PIO2_19 int_pin RTM11AT PIO3_4 INT int_pin PIO3_4 rst_pin RTM11AT PIO3_5 RESET PIO3_5 RTM11AT rst_pin PIO3_5rst_pin rst_pin RTM11AT 1 aw_local aw_const struct awbl_rtm11at_devinfo g_rtm11at_devinfo_0 = { 2 { RTM11AT_UART0_COMID, RTM11AT_UART1_COMID}, , , 5 PIO2_19, 6 PIO3_4, 7 PIO3_5, 8 }; RTM11AT RTM11AT awbl_hwconf_rtm11at_0.h 1 #ifdef AW_DEV_RTM11AT_0 2 3 #include "driver/rtc/awbl_rtm11at.h" 418

432 4 #include "aw_prj_params.h" 5 6 /* RTM11AT */ 7 aw_local aw_const struct awbl_rtm11at_devinfo g_rtm11at_devinfo_0 = { 8 { RTM11AT_UART0_COMID, RTM11AT_UART1_COMID}, , PIO2_19, 12 PIO3_4, 13 PIO3_5, 14 }; /* RTM11AT */ 17 aw_local struct awbl_rtm11at_dev g_rtm11at_dev0; #define AWBL_HWCONF_RTM11AT_0 \ 20 { \ 21 AWBL_RTM11AT_NAME, \ 22 0, \ 23 AWBL_BUSID_SPI, \ 24 IMX28_SSP2_BUSID, \ 25 (struct awbl_dev *)& g_rtm11at_dev0, \ 26 & g_rtm11at_devinfo_0 \ 27 }, 28 #else 29 #define AWBL_HWCONF_RTM11AT_0 30 #endif AWBL_HWCONF_RTM11AT_0 AW_DEV_RTM11AT_0 AWBL_HWCONF_RTM11AT_ aw_const struct awbl_devhcf g_awbl_devhcf_list[] = { // 2 //... 3 AWBL_HWCONF_RTM11AT_0 // RTM11AT 4 //... 5 }; AWBL_HWCONF_RTM11AT_0 awbl_hwconf_rtm11at_0.h RTM11AT RTM11AT ID RTM11AT_UART0_COMID 419

433 RTM11AT_UART1_COMIDCOM6 COM com COM6 COM7 COM6 COM7 COM6 COM7 RTM11AT COM6 RTM11AT COM RTM11AT 1 #include "aworks.h" 2 #include "aw_serial.h" 3 #include "aw_delay.h" 4 #include "aw_vdebug.h" 5 #include "aw_ioctl.h" 6 7 #define TEST_COM_RX COM6 8 #define TEST_COM_TX COM int aw_main() 11 { 12 char buf[10]; 13 int len = 0; aw_serial_ioctl(test_com_rx, SIO_BAUD_SET, (void *)115200); // aw_serial_ioctl(test_com_tx, SIO_BAUD_SET, (void *)115200); // aw_serial_ioctl(test_com_rx, AW_TIOCRDTIMEOUT, (void *)10); // 10ms 18 while(1) { 19 len = aw_serial_read(test_com_rx, buf, 10); // 20 if (len > 0) { 21 aw_serial_write(test_com_tx, buf, len); // 22 } 23 aw_mdelay(100); 24 } 25 } 420

434 E 2 PROM E 2 PROMElectrically Erasable Programable Read-Only Memory FM24C02 AWorks 15.1 FM24C FM24C02 E 2 PROM 2K2048bits /8 0x00 ~ 0xFFFM24C02 page 8 0x08 0x100x FM24C02 I 2 C SDA SCL 8PIN SOIC 15.1 WP 0 0x00 0x07 1 0x08 0x0F 30 0xF0 0xF7 31 0xF8 0xFF 15.1 FM24C02 421

435 A 2A 1A 0 FM24C02 I 2 C AWorks I 2 C /FM24C02 7-bit FM24C02 7 I 2 C A2 A1 A0 7-bit 101 0A 2A 1A 0 ZLG E 2 PROM MicroPort-EEPROM MicroPort 15.2 A 2 A 1A 0 7 0x E 2 PROM E 2 PROM AWbus-lite AWorks AWbus-lite 12.1 struct awbl_devhcf struct awbl_devhcf awbus_lite.h 1 struct awbl_devhcf { 2 const char *p_name; // 3 uint8_t unit; // 4 uint8_t bus_type; // 5 uint8_t bus_index; // 6 struct awbl_dev *p_dev; // 7 const void *p_devinfo; // () 8 }; 1 E 2 PROM E 2 PROM awbl_ep24cxx.h E 2 PROM awbl_ep24cxx.h 1 #define AWBL_EP24CXX_NAME "ep24cxx" AWBL_EP24CXX_NAMEAWorks ep24cxx E 2 PROM FM24C02 E 2 PROM 2 E 2 PROM 0 3 E 2 PROM I 2 C AWBL_BUSID_I2C 422

436 4 E 2 PROM I 2 C I 2 C I 2 C aw_prj_params.h i.mx28x 3 I 2 C I 2 C0 I 2 C1GPIO I 2 C I 2 C 1 #define IMX28_I2C0_BUSID 0 2 #define IMX28_I2C1_BUSID 1 3 #define GPIO_I2C0_BUSID 2 E 2 PROM I 2 C1 IMX28_I2C1_BUSID 5 awbl_ep24cxx.h E 2 PROM struct awbl_ep24cxx_dev struct awbl_ep24cxx_dev g_ep24cxx_dev; g_ep24cxx_dev p_dev 6 awbl_ep24cxx.h E 2 PROM struct awbl_ep24cxx_devinfo awbl_ep24cxx.h 1 struct awbl_ep24cxx_devinfo { 2 uint8_t addr; // 3 uint32_t type; // 4 const struct awbl_nvram_segment *p_seglst; // 5 size_t seglst_count; // 6 }; addr FM24C02 MicroPort-EEPROM 7 0x50type FM24CXX E 2 PROM KbitsFM24C Kbits /8 FM24CXX FM24CXX FM24C FM24C64 8K FM24C FM24C128 16K FM24C08 1K FM24C256 32K FM24C16 2K FM24C512 64K FM24C32 4K FM24C K 423

437 ep24cxx type FM24CXX FM24C02 AWBL_EP24CXX_EP24C02 FM24C64 AWBL_EP24CXX_EP24C64 FM24C04 AWBL_EP24CXX_EP24C04 FM24C128 AWBL_EP24CXX_EP24C128 FM24C08 AWBL_EP24CXX_EP24C08 FM24C256 AWBL_EP24CXX_EP24C256 FM24C16 AWBL_EP24CXX_EP24C16 FM24C512 AWBL_EP24CXX_EP24C512 FM24C32 AWBL_EP24CXX_EP24C32 FM24C1024 AWBL_EP24CXX_EP24C1024 FM24C02type AWBL_EP24CXX_EP24C02 p_seglst seglst_count p_seglst seglst_count AWorks struct awbl_nvram_segment awbl_nvram.h 1 struct awbl_nvram_segment { 2 char *p_name; // 3 int unit; // 4 uint32_t seg_addr; // 5 uint32_t seg_size; // 6 }; p_name unit "ip" IP "temp_limit"seg_addr seg_size FM24C02 FM24C02 5 IP aw_const struct awbl_nvram_segment g_ep24cxx_seglst[] = { 2 {"ip", 0, 0x00, 0x04}, // IP 0 0x {"ip", 1, 0x04, 0x04}, // IP 1 0x {"temp_limit", 0, 0x08, 0x08}, // 0x {"system", 0, 0x10, 0x80}, // 0x0C {"test", 0, 0x90, 0x70}, // 0x }; 424

438 p_seglst & g_ep24cxx_seglst[0]seglst_count 5AW_NELEMENTS( g_ep24cxx_seglst) aw_local aw_const struct awbl_ep24cxx_devinfo g_ep24cxx_devinfo = { 2 0x50, // I 2 C 3 AWBL_EP24CXX_EP24C02, // 4 & g_ep24cxx_seglst[0], // 5 AW_NELEMENTS( g_ep24cxx_seglst) // 6 }; E 2 PROM E 2 PROM awbl_hwconf_ep24cxx_0.h 1 #ifndef AWBL_HWCONF_EP24CXX_0_H 2 #define AWBL_HWCONF_EP24CXX_0_H 3 4 #ifdef AW_DEV_EXTEND_EP24CXX_0 5 6 #include "driver/nvram/awbl_ep24cxx.h" 7 8 aw_const struct awbl_nvram_segment g_ep24cxx_seglst[] = { 9 {"ip", 0, 0x00, 0x04}, // IP 0 0x {"ip", 1, 0x04, 0x04}, // IP 1 0x {"temp_limit", 0, 0x08, 0x08}, // 0x {"system", 0, 0x10, 0x80}, // 0x0C {"test", 0, 0x90, 0x70}, // 0x }; aw_local aw_const struct awbl_ep24cxx_devinfo g_ep24cxx_devinfo = { 17 0x50, // I 2 C 18 AWBL_EP24CXX_EP24C256, // 19 & g_ep24cxx_seglst[0], // 20 AW_NELEMENTS( g_ep24cxx_seglst) // 21 }; aw_local struct awbl_ep24cxx_dev g_ep24cxx_dev; // EP24CXX // 26 #define AWBL_HWCONF_EP24CXX_0 \ 27 { \ 28 AWBL_EP24CXX_NAME, \ 29 0, \ 425

439 30 AWBL_BUSID_I2C, \ 31 IMX28_I2C1_BUSID, \ 32 (struct awbl_dev *)& g_ep24cxx_dev, \ 33 & g_ep24cxx_devinfo \ 34 }, #else 37 #define AWBL_HWCONF_EP24CXX_0 38 #endif #endif AWBL_HWCONF_EP24CXX_0 AW_DEV_EXTEND_EP24CXX_0 AWBL_HWCONF_EP24CXX_ aw_const struct awbl_devhcf g_awbl_devhcf_list[] = { // 2 //... 3 AWBL_HWCONF_EP24CXX_0 // EEROMEP24CXX 4 //... 5 }; AWBL_HWCONF_EP24CXX_0 awbl_hwconf_ep24cxx_0.h E 2 PROM E 2 PROM AW_DEV_EXTEND_EP24CXX_0 aw_prj_params.h NVRAM E 2 PROM NVRAM 1 ip ip temp_limit system test E 2 PROM AWorks NVRAM NVRAM

440 15.6 NVRAM aw_nvram.h aw_err_t aw_nvram_set (char int char int int aw_err_t aw_nvram_get (char int char int int 1 *p_name, unit, *p_buf, offset, len); *p_name, unit, *p_buf, offset, len); aw_err_t aw_nvram_set (char*p_name, int unit, char *p_buf, int offset, int len); p_name unit p_buf offset len AW_OK IP IP unit8_t ip[4] = {192, 168, 40, 12}; 2 aw_nvram_set("ip", 0, &ip[0], 0, 4); // "ip" 2 aw_err_t aw_nvram_get (char*p_name, int unit, char *p_buf,int offset,int len); p_name unit p_buf offset len AW_OK IP IP unit8_t ip[4]; 2 aw_nvram_get("ip", 0, &ip[0], 0, 4); // "ip" NVRAM NVRAM app_test_nvram.c 1 #include "ametal.h" 2 #include "am_nvram.h" 427

441 3 #include "app_test_nvram.h" 4 5 int app_test_nvram (char *p_name, uint8_t unit) 6 { 7 int i; 8 char data[20]; 9 10 for (i = 0; i < 20; i++) // 11 data[i] = i; 12 aw_nvram_set(p_name, unit, &data[0], 0, 20); // "test" for (i = 0; i < 20; i++) // 14 data[i] = 0; 15 aw_nvram_get(p_name, unit, &data[0], 0, 20); // "test" for (i = 0; i < 20; i++) { // 17 if (data[i]!= i) { 18 return AW_ERROR; 19 } 20 } 21 return AW_OK; 22 } app_test_nvram.h 1 #pragma once 2 #include "ametal.h" 3 4 int app_test_nvram(char *p_name, uint8_t unit); NVRAM AW_OK AW_ERROR NVRAM AWorks NVRAM 1 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_led.h" 4 #include "app_test_nvram.h" 5 6 int aw_main (void) 7 { 8 if (app_test_nvram("test", 0)!= AM_OK) { 9 aw_led_on(1); // LED1 10 while(1); 428

442 11 } 12 while (1) { 13 aw_led_toggle(0); // LED0 14 aw_mdelay(100); 15 } 16 } 15.2 SPI NOR Flash E 2 PROM SPI NOR Flash SPI NOR Flash SPI MX25L1606 AWorks Flash MX25L M bits 2M16M/8 0x ~ 0x1FFFFF MX25L1606 block sectorpage K K MX25L1606 block sector page 0 0x x0000FF x000F00 0x000FFF x00F000 0x00F0FF x00FF00 0x00FFFF MX25L SPI 0 3SPI CS MOSIMISOCLK 8PIN SOP 15.3CS#1SO#2 SI#5SCLK#6 SPI CSMISO MOSI CLK VCC#8 GND#4 WP#3 HOLD#7 ZLG SPI NOR Flash MicroPort-Flash MicroPort R3 R4 WP HOLD R2 R1 nwp HOLD SPI MX25L SPI Flash 429

443 SPI NOR Flash AWorks AWBus-lite AWBus-lite 6 1 SPI NOR Flash awbl_spi_flash.h SPI NOR Flash awbl_spi_flash.h 1 #define AWBL_SPI_FLASH_NAME "awbl_spi_flash" AWBL_SPI_FLASH_NAME AWorks SPI FLASH MX25L SPI NOR Flash 0 3 MX25L1606 SPI SPI AWBL_BUSID_SPI 4 MX25L1606 SPI SPI SPI aw_prj_params.h i.mx28x 5 SPI SSP0SSP1SSP2SSP3 GPIO SPI SPI 1 #define IMX28_SSP0_BUSID 0 2 #define IMX28_SSP1_BUSID 1 3 #define IMX28_SSP2_BUSID 2 4 #define IMX28_SSP3_BUSID 3 5 #define GPIO_SPI0_BUSID 4 MX25L1606 SSP2 IMX28_SSP2_BUSID 5 awbl_spi_flash.h SPI NOR Flash struct awbl_spi_flash_dev struct awbl_spi_flash_dev g_spi_flash_dev0; g_spi_flash_dev0 p_dev 6 awbl_spi_flash.h SPI NOR Flash struct awbl_spi_flash_devinfo

444 15.19 awbl_spi_flash.h 1 struct awbl_spi_flash_devinfo { 2 const char *name; // 3 uint_t block_size; // 4 uint_t nblocks; // 5 uint_t page_size; // 6 uint16_t spi_mode; // SPI 7 int spi_cs_pin; // SPI 8 uint32_t spi_speed; // SPI 9 const struct awbl_spi_flash_mtd_ex *p_mtd_ex; // MTD 10 const void *p_nvram_info; // NVRAM 11 void (*pfunc_plfm_init)(void); // 12 }; name block_size nblocks page_size spi_mode SPI spi_cs_pin spi_speed MTD NVRAM p_mtd_ex p_nvram_info pfunc_plfm_init nameblock_size nblocks page_size name /sflash0 block_size MX25L K 16 4K block_size 64K SPI NOR Flash SPI NOR FLASH E 2 PROM

445 MX25L1606 4K4096 block_size 4096 nblocks MX25L1606 2M 4K5122 * 1024 * 1024 / 4096 page_size SPI NOR Flash 1 MX25L page_size 256 SPI SPI SPI spi_mode spi_cs_pin spi_speed spi_mode SPI MX25L spi_mode AW_SPI_MODE_0 spi_cs_pin MCU MX25L1606 CS IO PIO2_19 CS spi_cs_pin PIO2_19 spi_speed SPI MX25L MHz SPI 28MHz MTD SPI NOR Flash MTD Memory Technology Device MTD SPI NOR Flash MTD p_mtd_ex MTD struct awbl_spi_flash_mtd_ex struct awbl_spi_flash_mtd_ex awbl_spi_flash.h 1 struct awbl_spi_flash_mtd_ex { 2 void *p_mtd; // MTD 3 const void *p_info; // MTD 5 aw_err_t (*pfn_init) (struct awbl_spi_flash_dev *p_flash, // 6 void *p_mtd, 7 const void *p_info); 8 }; p_mtd MTD MTD struct awbl_spi_flash_mtd MTD MTD 1 struct awbl_spi_flash_mtd g_fmtd0; g_fmtd0 p_mtd p_info SPI NOR Flash MTD struct awbl_spi_flash_mtd_info

446 15.22 struct awbl_spi_flash_mtd_info awbl_spi_flash_mtd.h 1 struct awbl_spi_flash_mtd_info { 2 uint_t start_blk; // 3 uint_t nblks; // 4 }; SPI NOR Flash MTD start_blk nblks MX25L ~ MTD 256 MTD NVRAM NVRAM MTD MTD 1 aw_local aw_const struct awbl_spi_flash_mtd_info g_fmtd_info0 = { 2 0, // // }; 256 MTD 4K MTD 1M pfn_init SPI NOR Flash MTD AWorks aw_err_t awbl_spi_flash_mtd_init ( struct awbl_spi_flash_dev void const void *p_flash, *p_obj, *p_info); pfn_init MTD MTD 1 struct awbl_spi_flash_mtd_ex g_fmtd_ex0 = { 2 & g_fmtd0, // MTD 3 & g_fmtd_info0, // MTD 4 awbl_spi_flash_mtd_init // MTD 5 }; g_fmtd_ex0 p_mtd_ex SPI NOR Flash MTD p_mtd_ex NULL /sflash0 1M MTD MTD NVRAM SPI NOR Flash NVRAM NVRAM p_nvram_info NVRAM struct awbl_spi_flash_nvram_info

447 15.25 NVRAM awbl_spi_flash_nvram.h 1 struct awbl_spi_flash_nvram_info { 2 const struct awbl_nvram_segment *p_seglst; 3 uint_t seglst_count; 4 uint8_t *p_blk_buf; 5 }; p_seglst seglst_count p_seglst seglst_count MX25L ~ * SPI NOR Flash 1 aw_const struct awbl_nvram_segment g_ep24cxx_seglst[] = { 2 {"spi_nor_flash_nvram_test", 0, 511*4096, 4096}, // 3 }; NVRAM MTD MTD NVRAM NVRAM aw_nvram_set() MX25L1606 MX25L1606 E 2 PROM MX25L1606 1K 4K 4K 1K 3K MX25L1606 p_blk_buf block_size MX25L NVRAM NVRAM 1 uint8_t g_snvram_buf0[4096] = {0}; // 4K 2 3 aw_local aw_const struct awbl_spi_flash_nvram_info g_fnvram_info0 = { 4 g_snvram_seglst0, // 5 AW_NELEMENTS( g_snvram_seglst0), // 6 g_snvram_buf0 7 }; g_fnvram_info0 p_nvram_info SPI NOR Flash NVRAM p_nvram_info NULL 434

448 pfunc_plfm_init GPIO pfunc_plfm_init NULL MX25L aw_local aw_const struct awbl_spi_flash_devinfo g_spi_flash_devinfo0 = { 2 "/sflash0", // flash , // flash , // flash 5 256, // flash 6 AW_SPI_MODE_0, // SPI 7 PIO2_19, // */ , // SPI 9 & g_fmtd_ex0, 10 & g_fnvram_info0, // NVRAM 11 NULL // 12 }; SPI NOR Flash MX25L1606 awbl_hwconf_spi_flash0.h 1 #ifndef AWBL_HWCONF_SPI_FLASH0_H 2 #define AWBL_HWCONF_SPI_FLASH0_H 3 4 #ifdef AW_DEV_SPI_FLASH0 5 6 #include "aw_gpio.h" 7 #include "aw_spi.h" 8 #include "driver/norflash/awbl_spi_flash.h" 9 10 aw_local aw_const struct awbl_spi_flash_devinfo g_spi_flash_devinfo0 = { 11 // }; aw_local struct awbl_spi_flash_dev g_spi_flash_dev0; // // 17 #define AWBL_HWCONF_SPI_FLASH0 \ 18 { \ 19 AWBL_SPI_FLASH_NAME, \ 20 0, \ 21 AWBL_BUSID_SPI, \ 435

449 22 IMX28_SSP2_BUSID, \ 23 &( g_spi_flash_dev0.spi.super), \ 24 & g_spi_flash_devinfo0 \ 25 }, #else 28 #define AWBL_HWCONF_SPI_FLASH0 29 #endif #endif AWBL_HWCONF_SPI_FLASH0 AW_DEV_SPI_FLASH0 AWBL_HWCONF_SPI_FLASH aw_const struct awbl_devhcf g_awbl_devhcf_list[] = { // 2 //... 3 AWBL_HWCONF_SPI_FLASH0 // SPI NOR FLASHMX25L //... 5 }; AWBL_HWCONF_SPI_FLASH0 awbl_hwconf_spi_flash0.h MTD MX25L1606 "/sflash0" 1M MTD MTD SPI FLASH JFFS2YAFFSUFFS FFS Flash FLash file system UFFS UFFS UFFS am_prj_param.h AW_COM_FS_UFFS UFFS am_prj_param.h 1 #define AW_COM_FS_UFFS // UFFS aw_open()aw_write() aw_read()aw_close() 1 int aw_make_fs (const char *dev_name, // const char *fs_name, // const struct aw_fs_format_arg *fmt_arg); // 436

450 /sflash0uffs dev_name /sflash0fs_name uffs fmt_arg struct aw_fs_format_arg struct aw_fs_format_arg fs/aw_fs_type.h 1 struct aw_fs_format_arg { 2 const char *vol_name; // 3 size_t unit_size; // 4 uint_t flags; // 5 }; UFFS NULL MX25L flags AW_FS_FMT_FLAG_LOW_LEVEL MTD UFFS 1 const struct aw_fs_format_arg fmt = { // 2 NULL, // NULL , // 4K 4 AW_FS_FMT_FLAG_LOW_LEVEL // 5 }; #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "fs/aw_mount.h" 5 6 int aw_main() 7 { 8 aw_err_t err; 9 const struct aw_fs_format_arg fmt = { // 10 NULL, // NULL , // 4K 12 AW_FS_FMT_FLAG_LOW_LEVEL // 13 }; 14 ret = aw_make_fs("/sflash0", "uffs", &fmt); // 15 if (ret!= AW_OK) { 16 aw_kprintf("spi-flash make UFFS failed %d.\r\n", ret); 17 } else { 18 aw_kprintf("spi-flash make UFFS done.\r\n"); 437

451 19 } 20 while(1) { 21 aw_mdelay(1000); 22 } 23 } 2 int aw_mount (const char *mnt, // const char *dev, // const char *fs, // unsigned flags); // 0 /sflash0/sf dev_name "/sflash0 fs_name uffs UFFS fs uffs MTD 1 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "fs/aw_mount.h" 5 6 int aw_main(void) 7 { 8 if (aw_mount("/sf", "/sflash0", "uffs", 0)!= AW_OK) { 9 aw_kprintf("mount failed!\r\n"); 10 } else { 11 aw_kprintf("mount OK! \r\n"); 12 } 13 while(1) { 14 aw_mdelay(1000); 15 } 16 } SPI NOR Flash 1 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_led.h" 4 #include "aw_vdebug.h" 438

452 5 #include "fs/aw_mount.h" 6 #include "io/aw_fcntl.h" 7 #include "io/aw_unistd.h" 8 9 aw_local aw_err_t fs_rw_test (void) 10 { 11 aw_err_t ret; 12 int fd, i; 13 static char buf[512]; fd = aw_open("/sf/test.txt", O_RDWR O_CREAT O_TRUNC, 0777); // 16 if (fd < 0) { 17 aw_kprintf("spi-flash create file failed %d.\r\n", ret); 18 return AW_ERROR; 19 } 20 aw_kprintf("spi-flash create file done.\r\n"); for (i = 0; i < sizeof(buf); i++) { // 23 buf[i] = (char)(i & 0xFF); 24 } ret = aw_write(fd, buf, sizeof(buf)); // 27 if (ret!= sizeof(buf)) { 28 aw_close(fd); 29 aw_kprintf("spi-flash write file failed %d.\r\n", ret); 30 return AW_ERROR; 31 } 32 aw_kprintf("spi-flash write file done.\r\n"); aw_close(fd); // 35 aw_kprintf("spi-flash close file.\r\n"); fd = aw_open("/sf/test.txt", O_RDONLY, 0777); // 38 if (fd < 0) { 39 aw_kprintf("spi-flash open file failed %d.\r\n", ret); 40 return AW_ERROR; 41 } 42 aw_kprintf("spi-flash open file done.\r\n"); ret = aw_read(fd, buf, sizeof(buf)); // if (ret!= sizeof(buf)) { 47 aw_close(fd); 48 aw_kprintf("spi-flash read file failed %d.\r\n", ret); 439

453 49 return AW_ERROR; 50 } 51 aw_kprintf("spi-flash read file done.\r\n"); aw_close(fd); // 54 aw_kprintf("spi-flash close file.\r\n"); for (i = 0; i < sizeof(buf); i++) { 57 if (buf[i]!= (char)(i & 0xFF)) { 58 aw_kprintf("spi-flash verify file data failed at %d.\r\n", i); 59 return AW_ERROR; 60 } 61 } 62 aw_kprintf("spi-flash verify file data successfully.\r\n"); 63 return AW_OK; 64 } int aw_main() 67 { 68 if (aw_mount("/sf", "/sflash0", "uffs", 0)!= AW_OK) { 69 aw_kprintf("mount failed!\r\n"); 70 } else { 71 aw_kprintf("mount OK! \r\n"); 72 if ( fs_rw_test()!= AW_OK) { 73 aw_led_on(1); // LED1 74 while(1); 75 } 76 } 77 while(1) { 78 aw_led_toggle(0); // LED0 79 aw_mdelay(1000); 80 } 81 } LED0 LED NVRAM MX25L spi_nor_flash_nvram_test NVRAM NVRAM 15.15testspi_nor_flash_nvram_test 440

454 SPI NOR Flash NVRAM 1 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_led.h" 4 #include "app_test_nvram.h" 5 6 int aw_main (void) 7 { 8 if (app_test_nvram("spi_nor_flash_nvram_test", 0)!= AM_OK) { 9 aw_led_on(1); // LED1 10 while(1); 11 } 12 while (1) { 13 aw_led_toggle(0); // LED0 14 aw_mdelay(100); 15 } 16 } 15.3 RTC PCF85063 RTC RTC RTC RTC RTC RTC RX8025T DS1302 RX8025T DS1302 PCF85063 RTC RTC / PCF85063 RX8025T DS1302 I 2 C I 2 C RTC RAM

455 RTC RTC RTC aw_rtc.h aw_err_t aw_rtc_time_get (int rtc_id, aw_tm_t *p_tm); aw_err_t aw_rtc_time_set (int rtc_id, aw_tm_t *p_tm); rtc_id RTC ID p_tm PCF85063 RTC RTC ID ID RTC RTC ID PCF85063 ID 12.9 RTC 1s RTC app_rtc_time_show.c 1 #include "aworks.h" 2 #include "aw_rtc.h" 3 #include "aw_vdebug.h" 4 #include "aw_delay.h" 5 6 int app_rtc_time_show (int rtc_id) 7 { 8 // :32:30 9 aw_tm_t tm = {30, 32, 9, 26, 8-1, , 0, 0, -1}; // :32:30 12 aw_rtc_time_set(rtc_id, &tm); 13 while(1) { 14 aw_rtc_time_get(rtc_id, &tm); 15 aw_kprintf("%04d-%02d-%02d %02d:%02d:%02d \r\n", 16 tm.tm_year+1900, tm.tm_mon + 1, tm.tm_mday, 17 tm.tm_hour, tm.tm_min, tm.tm_sec); 18 aw_mdelay(1000); 19 } 20 return 0; 21 } RTC app_rtc_time_show.h 1 #pragma once 2 #include "aworks.h" 3 4 int app_rtc_time_show (int rtc_id); 442

456 rtc_id RTC PCF85063 RTC ID 0 PCF RTC PCF #include "aworks.h" 2 #include "aw_delay.h" 3 #include "app_rtc_time_show.h" 4 5 int aw_main (void) 6 { 7 app_rtc_time_show(0); 8 while(1) { 9 aw_mdelay(1000); 10 } 11 } RX8025T 1 RX8025T KHz DTCXO I 2 C I 2 C 400kbps RX8025T 15.5 SCL SDA I 2 C VDD VSS CLKOUT T1(CE)TESTT2(Vpp) NC INT CLK_EN CLKOUT RX8025T 7 I 2 C 0x RX8025T 15.6 RX8025T ZLG RX8025T MicroPort-RX8025T MicroPort

457 2 RX8025T AWorks AWBus-lite AWBus-lite 6 RX8025T awbl_rx8025t.h RX8025T awbl_rx8025t.h 1 #define AWBL_RX8025T_NAME "rx8025t" AWBL_RX8025T_NAME RX8025T 0 RX8025T I 2 C I 2 C AWBL_BUSID_I2C RX8025T I 2 C I 2 C I 2 C aw_prj_params.h i.mx28x 3 I 2 C I 2 C0 I 2 C1GPIO I 2 C I 2 C 1 #define IMX28_I2C0_BUSID 0 2 #define IMX28_I2C1_BUSID 1 3 #define GPIO_I2C0_BUSID 2 RX8025T I 2 C1 IMX28_I2C1_BUSID awbl_rx8025t.h RX8025T struct awbl_rx8025t_dev RX8025T 1 struct awbl_rx8025t_dev g_rx8025t_dev0; g_rx8025t_dev0 p_dev awbl_rx8025t.h RX8025T struct awbl_rx8025t_devinfo RX8025T awbl_rx8025t.h 1 typedef struct awbl_rx8025t_devinfo { 2 struct awbl_rtc_servinfo rtc_servinfo; // RTC 444

458 3 uint8_t addr; // 4 } awbl_rx8025t_devinfo_t; rtc_servinfo RTC RTC RTC awbl_rtc.h 1 struct awbl_rtc_servinfo { 2 int rtc_id; // RTC ID 3 }; rtc_id RX8025T RTC ID ID RX8025T PCF85063 RTC ID RX8025T RTC ID 1 addr RX8025T 7 I 2 C RX8025T RX8025T 7 I 2 C 0x32 rtc_id addr RX8025T RX8025T 1 aw_local aw_const struct awbl_rx8025t_devinfo g_rx8025t_0_devinfo = { 2 { 3 1 // RTC 4 }, 5 0x32 // I 2 C 6 }; g_rx8025t_0_devinfo p_devinfo RX8025T RX8025T awbl_hwconf_rx8025t_0.h 1 #ifndef AWBL_HWCONF_RX8025T_0_H 2 #define AWBL_HWCONF_RX8025T_0_H 3 4 #ifdef AW_DEV_EXTEND_RX8025T_0 5 #include "aw_i2c.h" 6 #include "driver/rtc/awbl_rx8025t.h" 7 aw_local aw_const struct awbl_rx8025t_devinfo g_rx8025t_0_devinfo = { 8 { 9 1 // RTC 10 }, 11 0x32 // I 2 C 12 }; 13 aw_local struct awbl_rx8025t_dev g_rx8025t_dev0; // #define AWBL_HWCONF_RX8025T_0 \ 445

459 16 { \ 17 AWBL_RX8025T_NAME, \ 18 0, \ 19 AWBL_BUSID_I2C, \ 20 IMX28_I2C1_BUSID, \ 21 (struct awbl_dev *)& g_rx8025t_dev0, \ 22 & g_rx8025t_0_devinfo \ 23 }, #else 26 #define AWBL_HWCONF_RX8025T_0 27 #endif #endif AWBL_HWCONF_RX8025T_0 AW_DEV_EXTEND_RX8025T_0 AWBL_HWCONF_RX8025T_ RX8025T 1 aw_const struct awbl_devhcf g_awbl_devhcf_list[] = { // 2 //... 3 AWBL_HWCONF_RX8025T_0 // RTCRX8025T 4 //... 5 }; AWBL_HWCONF_RX8025T_0 awbl_hwconf_rx8025t_0.h 3 RX8025T RX8025T RTC ID RTC ID 1 RX8025T RTC RTC RX8025T 1 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "app_rtc_time_show.h" 4 5 int aw_main (void) 6 { 7 app_rtc_time_show(1); // ID 1 RTC 8 while(1) { 9 aw_mdelay(1000); 10 } 11 } 446

460 RTC PCF85063 RX8025T RX8025T RTC ID DS DS RAM DS1302 1W DS1302 VCC DS1302 DS X1#2 X2# kHz CE#5I/O#6SCLK#7DS1302 DS1302 CE CE CE RST I/O SCLK I/O SPI DS1302 SCLK SPI SCLK CE SPI CS I/O MOSI MISO 15.8a 3 SPI MCU MOSI MISO 15.8b 15.8 MCU DS1302 SPI MOSI MISO SPI MOSIDS1302 I/O MISO DS1302 I/O GND #4VCC1#8 VCC2#1 DS1302 VCC2 VCC1 DS1302 VCC1 VCC2 VCC2 VCC1+0.2VVCC2 VCC2 VCC1 VCC1 VCC2 VCC1 VCC2 VCC1 VCC1 VCC1 VCC2 VCC1 ZLG DS

461 MicroPort-DS1302 MicroPort DS DS1302 AWorks AWBus-lite AWBus-lite 6 DS1302 awbl_ds1302.h DS1302 awbl_ds1302.h #define AWBL_DS1302_NAME "ds1302" AWBL_DS1302_NAME DS DS1302 SPI SPI AWBL_BUSID_SPI DS1302 SPI SPI aw_prj_params.h i.mx28x 5 SPI SSP0SSP1SSP2SSP3 GPIO SPI SPI 1 #define IMX28_SSP0_BUSID 0 2 #define IMX28_SSP1_BUSID 1 3 #define IMX28_SSP2_BUSID 2 4 #define IMX28_SSP3_BUSID 3 5 #define GPIO_SPI0_BUSID 4 DS1302 SPI SPI AWorks GPIO SPI DS1302 GPIO SPI 0 DS1302 GPIO_SPI0_BUSID 448

462 awbl_ds1302.h DS1302 struct awbl_ds1302_dev DS struct awbl_ds1302_dev g_ds1302_dev0; g_ds1302_dev0 p_dev awbl_ds1302.h DS1302 awbl_ds1302_devinfo_t DS1302 awbl_ds1302.h 1 typedef struct awbl_ds1302_devinfo { 2 struct awbl_rtc_servinfo rtc_servinfo; // RTC 3 uint32_t spi_speed; // SPI 4 uint32_t ce_pin; // CE IO 5 } awbl_ds1302_devinfo_t; rtc_servinfo RTC RTC RTC awbl_rtc.h 1 struct awbl_rtc_servinfo { 2 int rtc_id; // RTC ID 3 }; rtc_id DS1302 RTC ID ID DS1302 PCF85063 RX8025T DS1302 RTC ID 2 spi_speed SPI DS1302 2MHzVCC 5V 0.5MHzVCC 2V SPI 0.3MHz ce_pin MCU DS1302 CE IO CE SPI PIO2_19 CE spi_cs_pin PIO2_ DS aw_local aw_const awbl_ds1302_devinfo_t g_ds1302_0_devinfo = { 2 { 3 2 // RTC 4 }, , 6 PIO2_15, // CE 7 }; & g_ds1302_0_devinfo p_devinfo DS

463 15.56 DS1302 awbl_hwconf_ds1302_0.h 1 #ifndef AWBL_HWCONF_DS1302_0_H 2 #define AWBL_HWCONF_DS1302_0_H 3 4 #ifdef AW_DEV_EXTEND_DS1302_0 5 #include "driver/rtc/awbl_ds1302.h" 6 aw_local aw_const awbl_ds1302_devinfo_t g_ds1302_0_devinfo = { 7 { 8 2 // RTC 9 }, , 11 PIO2_15, // CE 12 }; 13 aw_local struct awbl_ds1302_dev g_ds1302_dev0; // #define AWBL_HWCONF_DS1302_0 \ 16 { \ 17 AWBL_DS1302_NAME, \ 18 0, \ 19 AWBL_BUSID_PLB, \ 20 0, \ 21 (struct awbl_dev *)& g_ds1302_dev0, \ 22 & g_ds1302_0_devinfo \ 23 }, 24 #else 25 #define AWBL_HWCONF_DS1302_0 26 #endif #endif AWBL_HWCONF_DS1302_0 AW_DEV_EXTEND_DS1302_0 AWBL_HWCONF_DS1302_ DS aw_const struct awbl_devhcf g_awbl_devhcf_list[] = { // 2 //... 3 AWBL_HWCONF_DS1302_0 // RTCDS //... 5 }; AWBL_HWCONF_DS1302_0 awbl_hwconf_ds1302_0.h 450

464 3 DS1302 DS1302 RTC ID RTC ID 2 DS1302 RTC RTC DS #include "aworks.h" 2 #include "aw_delay.h" 3 #include "app_rtc_time_show.h" 4 5 int aw_main (void) 6 { 7 app_rtc_time_show(2); // ID 2 RTC 8 while(1) { 9 aw_mdelay(1000); 10 } 11 } PCF85063 DS1302 DS1302 RTC ID ZLG72128 ZLG72128 ZLG LED 32 8 CtrlShiftAlt I 2 C ZLG ZLG LED I 2 C I/O 3.0 ~ 5.5V -40 ~ +85 TSSOP ZLG

465 ZLG RST 2 VSS 3 VCAP 4 VDD 5 NC 6 KEY_INT 7 SDA I 2 C 8 SCL I 2 C 9 ~ 12 COM11 ~ 8 / KR3 ~ 0 11 ~ 8 / 3 ~ 0 13 ~ 20 COM7~0 / KC7 ~ 0 7 ~ 0 / 7 ~ 0 21 ~ 28 SEG0 ~ SEG7 a ~ dp ZLG COM8KR0 ~ COM11KR3 COM0KC0 ~ COM7KC INT F0 ~ F7 bit0 - bit INT ZLG k

466 ZLG ZLG

467 ZLG ZLG ZLG ZLG72128 ( ZLG72128 VCC GND 47 ~ 470uF I 2 C SCL SDA 4.7K l00kbps RST MCU I/O KEY_INT MCU I/O 4 MiniPort-ZLG72128 ZLG COM0 ~ COM11 12 COM0 COMx 8 COM0 ~ COM7 8 ZLG MiniPort-ZLG72128 MiniPort MiniPort-ZLG COM MiniPort-ZLG IO MiniPort-ZLG72128 RSTKEY_INT SDA SCLRST ZLG72128KEY_INT ZLG72128 INT SDA SCL I 2 C MiniPort-ZLG72128 AWorks ZLG

468 ZLG72128 AWorks AWBus-lite AWBus-lite 6 1 ZLG72128 awbl_zlg72128.h ZLG72128 awbl_zlg72128.h 1 #define AWBL_ZLG72128_NAME "awbl_zlg72128" 2 ZLG ZLG72128 I 2 C I 2 C AWBL_BUSID_I2C 4 ZLG72128 I 2 C I 2 C I 2 C aw_prj_params.h i.mx28x 3 I 2 C I 2 C0 I 2 C1GPIO I 2 C I 2 C 1 #define IMX28_I2C0_BUSID 0 2 #define IMX28_I2C1_BUSID 1 3 #define GPIO_I2C0_BUSID 2 ZLG72128 I 2 C0 IMX28_I2C0_BUSID 5 awbl_zlg72128.h ZLG72128 struct awbl_zlg72128_dev struct awbl_zlg72128_dev g_miniport_zlg72128_dev; g_miniport_zlg72128_dev p_dev 6 awbl_zlg72128.h ZLG72128 struct awbl_zlg72128_devinfo struct awbl_zlg72128_devinfo 1 struct awbl_zlg72128_devinfo { 2 int digitron_disp_id; /* ID */ 3 int rst_pin; /* ZLG72128 */ 455

469 4 int int_pin; /* ZLG72128 */ 5 uint16_t interval_ms; /* */ 6 uint8_t digitron_num; /* */ 7 uint16_t blink_on_time; /* (ms) */ 8 uint16_t blink_off_time; /* (ms) */ 9 uint8_t key_use_row_flags; /* */ 10 uint8_t key_use_col_flags; /* */ 11 const int *p_key_codes; /* */ 12 }; digitron_disp_id ID 6.4 ID ID digitron_disp_id ZLG72128 ID 0 MiniPort-ZLG72128 digitron_disp_id 0 rst_pin ZLG72128 i.mx28x PIO1_17 ZLG72128 PIO1_17 ZLG72128 rst_pin PIO1_17rst_pin rst_pin -1 int_pin ZLG72128 KEY_INT ZLG72128 KEY_INT IO ZLG72128 KEY_INT ZLG72128 IO i.mx28x PIO1_18 ZLG72128 KEY_INT int_pin PIO1_18 interval_ms ZLG72128 KEY_INT IO IO IO ZLG72128 KEY_INT KEY_INT int_pin -1 I 2 C ZLG72128interval_ms 20ms interval_ms 20 int_pin int_pin -1 ZLG72128 interval_ms int_pin -1interval_ms digitron_num ZLG MiniPort-ZLG72128 digitron_num 2 blink_on_time blink_off_time blink_on_time blink_off_time ms ~ 900ms 50ms MiniPort-ZLG Hz blink_on_time blink_off_time

470 ZLG * 8 32 MiniPort-ZLG COM8KR0 COM11KR3 0 3 COM0KL0 COM1KL1 0 1 key_use_row_flags 0 3 AWBL_ZLG72128_IF_KEY_ROW_0 ~ AWBL_ZLG72128_IF_KEY_ROW_3 ZLG72128 COM8KR0 ~ COM11KR3 key_use_row_flags C MiniPort-ZLG key_use_row_flags AWBL_ZLG72128_KEY_ROW_0 AWBL_ZLG72128_KEY_ROW_3 key_use_col_flags 0 7 AWBL_ZLG72128_IF_KEY_COL_0 ~ AWBL_ZLG72128_IF_KEY_COL_7 ZLG72128 COM0KL0 ~ COM7KL7 key_use_col_flags C MiniPort-ZLG key_use_col_flags AWBL_ZLG72128_KEY_COL_0 AWBL_ZLG72128_KEY_COL_1 p_key_codes ZLG72128 p_key_codes MiniPort-ZLG aw_input_code.h 4 4 KEY0 ~ KEY aw_local aw_const int g_key_codes[] = { 2 KEY_0, KEY_1, 3 KEY_2, KEY_3 4 }; g_key_codes p_key_codes ZLG /* */ 2 aw_local aw_const int g_key_codes[] = { 3 KEY_0, KEY_1, 4 KEY_2, KEY_3 5 }; 6 7 aw_local aw_const 8 struct awbl_zlg72128_if_devinfo g_miniport_zlg72128_devinfo = { 9 0, /* */ 457

471 10 PIO1_17, /* */ 11 PIO1_18, /* */ 12 20, /* */ 13 2, /* 2 */ , /* 500ms */ , /* 500ms */ 16 AWBL_ZLG72128_KEY_ROW_0 \ 17 AWBL_ZLG72128_KEY_ROW_3, /* KR0KR3 */ 18 AWBL_ZLG72128_KEY_COL_0 \ 19 AWBL_ZLG72128_KEY_COL_1, /* KL0KL1 */ 20 g_key_codes, /* KEY_0 ~ KEY3 */ 21 }; ZLG ZLG72128 awbl_hwconf_miniport_zlg72128_0.h 1 #ifndef AWBL_HWCONF_MINPORT_ZLG72128_0_H 2 #define AWBL_HWCONF_MINPORT_ZLG72128_0_H 3 4 #ifdef AW_DEV_MINIPORT_ZLG #include "aw_types.h" 7 #include "driver/digitron_key/awbl_zlg72128.h" 8 9 /* */ 10 aw_local aw_const int g_key_codes[] = { 11 KEY_0, KEY_1, 12 KEY_2, KEY_3 13 }; aw_local aw_const 16 struct awbl_zlg72128_devinfo g_miniport_zlg72128_devinfo = { 17 0, /* */ 18 PIO1_17, /* */ 19 PIO1_18, /* */ 20 20, /* */ 21 2, /* 2 */ , /* 500ms */ , /* 500ms */ 24 AWBL_ZLG72128_KEY_ROW_0 \ 25 AWBL_ZLG72128_KEY_ROW_3, /* KR0KR3 */ 26 AWBL_ZLG72128_KEY_COL_0 \ 27 AWBL_ZLG72128_KEY_COL_1, /* KL0KL1 */ 28 g_key_codes, /* KEY_0 ~ KEY3 */ 458

472 29 }; aw_local struct awbl_zlg72128_dev g_miniport_zlg72128_dev; / * */ #define AWBL_HWCONF_MINIPORT_ZLG72128_0 \ 34 { \ 35 AWBL_ZLG72128_NAME, \ 36 0, \ 37 AWBL_BUSID_I2C, \ 38 IMX28_I2C0_BUSID, \ 39 (struct awbl_dev *)& g_miniport_zlg72128_dev, \ 40 &( g_miniport_zlg72128_devinfo) \ 41 }, #else 44 #define AWBL_HWCONF_MINIPORT_ZLG72128_0 45 #endif #endif AWBL_HWCONF_MINIPORT_ZLG72128_0 AW_DEV_MINIPORT_ZLG72128 AWBL_HWCONF_MINIPORT_ZLG72128_ aw_const struct awbl_devhcf g_awbl_devhcf_list[] = { // 2 //... 3 AWBL_HWCONF_MINIPORT_ZLG72128_0 // MiniPort-ZLG //... 5 }; AWBL_HWCONF_MINIPORT_ZLG72128_0 awbl_hwconf_miniport_zlg72128_0.h ZLG aw_err_t aw_digitron_disp_char_at (int id, int index, const char ch); id ZLG digitron_disp_id ZLG72128 ZLG72128 id digitron_disp_id index index MiniPort-ZLG72128 index 01ch 1 'H'

473 15.67 aw_digitron_disp_char_at() 1 aw_digitron_disp_char_at (0, 1, 'H'); 60s 5s #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_digitron_disp.h" 5 6 #define DIGITRON_ID 0 // 7 8 static void digitron_show_num (int id, int num) 9 { 10 char buf[3]; 11 aw_snprintf(buf, 3, "%2d", num); 12 aw_digitron_disp_str(id, 0, 2, buf); 13 } int aw_main() 16 { 17 unsigned int num = 60; // 60s aw_digitron_disp_decode_set( DIGITRON_ID, aw_digitron_seg8_ascii_decode); 19 while(1) { 20 digitron_show_num( DIGITRON_ID, num); // count 21 if (num < 5) { // 5 22 aw_digitron_disp_blink_set( DIGITRON_ID, 1, AW_TRUE); 23 } else { 24 aw_digitron_disp_blink_set( DIGITRON_ID, 1, AW_FALSE); 25 } 26 if (num){ // count num--; 28 } else { // count num = 60; 30 } 31 aw_mdelay(1000); 32 } 33 } ID 0 MiniPort-ZLG MiniPort-View MiniPort-ZLG

474 ZLG72128 aw_err_t aw_input_handler_register ( aw_input_handler_t aw_input_cb_t void *p_input_handler, pfn_cb, *p_usr_data); p_input_handler pfn_cb p_usr_data MiniPort-ZLG KEY_0KEY_1KEY_2KEY_3 KEY0 00 KEY ZLG #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_digitron_disp.h" 5 #include "aw_input.h" 6 7 /* */ 8 aw_local void input_key_proc (aw_input_event_t *p_input_data, void *p_usr_data) 9 { 10 if (AW_INPUT_EV_KEY == p_input_data->ev_type) { /* */ 11 aw_input_key_data_t *p_key_data = (aw_input_key_data_t *)p_input_data; 12 if (p_key_data->key_state!= 0) { /* */ 13 switch (p_key_data->key_code) { 14 case KEY_0: /* 00 */ 15 aw_digitron_disp_char_at(0, 0, '0'); 16 aw_digitron_disp_char_at(0, 1, '0'); 17 aw_digitron_disp_blink_set(0, 0, AW_TRUE); 18 aw_digitron_disp_blink_set(0, 1, AW_TRUE); 19 break; 20 case KEY_1: /* 01 */ 21 aw_digitron_disp_char_at(0, 0, '0'); 22 aw_digitron_disp_char_at(0, 1, '1'); 23 aw_digitron_disp_blink_set(0, 0, AW_FALSE); 24 aw_digitron_disp_blink_set(0, 1, AW_FALSE); 25 break; 461

475 26 case KEY_2: /* 10 */ 27 aw_digitron_disp_char_at(0, 0, '1'); 28 aw_digitron_disp_char_at(0, 1, '0'); 29 aw_digitron_disp_blink_set(0, 0, AW_TRUE); 30 aw_digitron_disp_blink_set(0, 1, AW_TRUE); 31 break; 32 case KEY_3: /* 11 */ 33 aw_digitron_disp_char_at(0, 0, '1'); 34 aw_digitron_disp_char_at(0, 1, '1'); 35 aw_digitron_disp_blink_set(0, 0, AW_FALSE); 36 aw_digitron_disp_blink_set(0, 1, AW_FALSE); 37 break; 38 default : 39 break; 40 } 41 } 42 } 43 } int aw_main (void) 46 { 47 aw_local aw_input_handler_t input_handler; 48 aw_input_handler_register(&input_handler, input_key_proc, NULL); 49 AW_FOREVER { 50 aw_mdelay(1000); 51 } 52 } KEY_0KEY_1KEY_2KEY_3 MiniPort-ZLG72128 MiniPort-ZLG KEY0 ~ KEY3 MiniPort-ZLG72128 AWorks 15.5 ADS131E0xA/D MCU ADC i.mx 28x LRADC HSADC A/D i.mx28x ADC 12 ADC A/D ADS131E0x ADS131E0x A/D 24 64kSamples/sPGA

476 15.12 ADS131E0x ADS131E04 TQFP ~105 ADS131E06 TQFP ~105 ADS131E08 TQFP ~105 AWorks ADS131E0x A/D 8 ADS131E08 A/D AWorks 1 8 1kSPS 118dB -110dB (THD)50Hz 60Hz -90dB 2mW kSPS SPI 4 GPIO 40 C +105 C 2 ADS131E ADS131E ADS131E08 DVDD 48,50 DGND 33,49,51 AVDD 19,21,22,56,59 AVSS 20,23,32,57,58 AVDD1 54 Charge pump AVSS1 53 VCAP1 ~ VCAP4 28,30,55,26 AVSS IN1N ~ IN8N 15,13,11,9,7,5,3,1 1 ~ 8 N IN1P ~ IN8P 16,14,12,10,8,6,4,2 1 ~ 8 P /DRDY 47 DIN 34 SPI MOSI DOUT 43 SPI MISO /CS 39 SPI SCLK 40 SPI START

477 GPIO1 ~ GPIO4 42,44,45,46 CLK 37 / DGND CLKSEL 52 CLK CLK DAISY_IN 41 DOUT DAISY_IN DGND /PWDN 35 /RESET 36 VREFN 25 AVSS VREFP 24 RESV1 31 DGND TESTNTESTP 1718 OPAMPN 61 OPAMPP 60 OPAMPOUT 63 NC 27,29,62,64 3 ADS131E08 8 ADC ADS131E ADS131E08 ADS131E08 464

478 ADS131E08 AWorks AWBus-lite AWBus-lite 6 1 ADS131E08 ADS131E08 awbl_adc_ ads131e08.h ADS131E08 1 #define AWBL_ADS131E08_NAME "awbl_adc_ads131e08" AWBL_ADS131E08_NAME 2 ADS131E ADS131E08 SPI SPI, AWBL_BUSID_SPI 4 ADS131E08 SPI SPI SPI aw_prj_params.h i.mx28x 5 SPI SSP0 ~ SSP3GPIO SPI SPI 1 #define IMX28_SSP0_BUSID 0 2 #define IMX28_SSP1_BUSID 1 3 #define IMX28_SSP2_BUSID 2 4 #define IMX28_SSP3_BUSID 3 5 #define GPIO_SPI0_BUSID 4 ADS131E08 SSP3 IMX28_SSP3_BUSID 5 awbl_adc_ads131e08.h ADS131E08 struct awbl_adc_ads131e08_dev ADS131E08 aw_local struct awbl_adc_ads131e08_dev g_adc_ads131e08_dev; g_adc_ads131e08_dev p_dev 6 awbl_adc_ads131e08.h ADS131E08 struct awbl_adc_ads131e08_devinfo

479 15.73 struct awbl_adc_ads131e08_devinfo 1 typedef struct awbl_adc_ads131e08_devinfo { 2 struct awbl_adc_servinfo adc_servinfo; // ADC 3 uint32_t vref; // ADC 4 const uint8_t *p_pga_gain; // 5 uint32_t spi_speed; // 6 int spi_cs_pin; // SPI CS 7 int ready_pin; // 8 int start_pin; // ADC 9 uint8_t data_bits_rate; // 10 void (*pfn_plfm_init) (void); // 11 } awbl_adc_ads131e08_devinfo_t; adc_servinfo ADC ADC ADC ch struct awbl_adc_servinfo struct awbl_adc_servinfo 1 struct awbl_adc_servinfo { 2 aw_adc_channel_t ch_min; 3 aw_adc_channel_t ch_max; 4 }; ch_min ADC ch_max ADC ADS131E A/D ADS131E ~ 7 ch_min 0ch_max 7 A/D A/D ADC i.mx28x A/D LRADC HSADC 24 0 ~ 23ADS131E08 0 ~ ~ 31ch_min 24ch_max 31 vref ADC mvads131e08 2.4V 4V 2.4V vref 2400 AVDD 5V 4V p_pga_gain ADS131E vref 2.4V A/D 0 ~ 2.4V 0 ~ 1.2V 2 A/D 0 ~ 2.4V 0.1mV 0.5mV 20% 5V 0.2% A/D p_pga_gain uint8_t pga_gain[8] = {1, 1, 2, 2, 4, 4, 8, 12}; 466

480 pga_gain p_pga_gain 1 p_pga_gain NULL 1 A/D vref GAIN ADC vref GAIN aw_adc_vref_get() vref GAIN Vref/GAIN spi_speed SPI ADS131E08 20MHz2.7VDVDD 3.6V 15MHz1.7VDVDD2.0VMCU SPI 6MHz, Hz SPI spi_cs_pin CS #39CS SPI i.mx28x PIO2_27 CS spi_cs_pin PIO2_27 ready_pin DRDY #47ADS131E08 DRDY MCU i.mx28x PIO0_27 ADS131E08 DRDY ready_pin PIO0_27 start_pin START #38START A/D A/D i.mx28x PIO0_28 START start_pin PIO0_28 data_bits_rate ADS131E kSPS Samples Per Sencond 16 64kSPS ADS131E08 (bits) (SPS) AWBL_ADC_ADS131E0X_16BIT_64KSPS 16 64K AWBL_ADC_ADS131E0X_16BIT_32KSPS 16 32K AWBL_ADC_ADS131E0X_24BIT_16KSPS 24 16K AWBL_ADC_ADS131E0X_24BIT_8KSPS 24 8K AWBL_ADC_ADS131E0X_24BIT_4KSPS 24 4K AWBL_ADC_ADS131E0X_24BIT_2KSPS 24 2K AWBL_ADC_ADS131E0X_24BIT_1KSPS 24 1K 467

481 24 16kSPS data_bits_rate AWBL_ADC_ADS131E0X_24BIT_16KSPS pfn_plfm_init NULL ADS131E08 1 static const uint8_t g_gain_pga[] = {1, 1, 2, 2, 4, 4, 8, 12}; // 2 3 aw_local aw_const struct awbl_adc_ads131e08_devinfo g_adc_ads131e08_devinfo = { 4 { 5 24, // 6 31 // 7 }, , // ADC 9 g_gain_pga, // , // SPI 11 PIO2_27, // SPI CS 12 PIO0_27, // ADC RDYIN 13 PIO0_28, // START 14 AWBL_ADC_ADS131E0X_24BIT_16KSPS // 24, 16k SPS 15 NULL 16 }; ADS131E ADS131E08 awbl_hwconf_adc_ads131e08.h 1 #ifndef AWBL_HWCONF_ADC_ADS131E08_H 2 #define AWBL_HWCONF_ADC_ADS131E08_H 3 #ifdef AW_DEV_ADC_ADS131E #include "driver/adc/awbl_adc_ads131e08.h" 6 7 #define ADC_SPI_DEV_CS_PIN PIO2_27 // ADC SPI CS 8 #define ADC_RDYIN_PIN PIO0_27 // ADC DRDY 9 #define ADC_START_PIN PIO0_28 // ADC START static const uint8_t g_gain_pga[] = {1, 1, 2, 2, 4, 4, 8, 12}; // /* */ 14 aw_local aw_const struct awbl_adc_ads131e08_devinfo g_adc_ads131e08_devinfo = { 15 { 16 24, // 468

482 17 31 // 18 }, , // ADC 20 g_gain_pga, // , // SPI 22 PIO2_27, // SPI CS 23 PIO0_27, // ADC RDYIN 24 PIO0_28, // START 25 AWBL_ADC_ADS131E0X_24BIT_16KSPS // 24, 16k SPS 26 NULL 27 }; /* */ 30 aw_local struct awbl_adc_ads131e08_dev g_adc_ads131e08_dev; #define AWBL_HWCONF_ADC_ADS131E08 \ 33 { \ 34 AWBL_ADS131E08_NAME, \ 35 0, \ 36 AWBL_BUSID_SPI, \ 37 IMX28_SSP3_BUSID, \ 38 (struct awbl_dev *)& g_adc_ads131e08_dev, \ 39 &( g_adc_ads131e08_devinfo) \ 40 }, #else 43 #define AWBL_HWCONF_ADC_ADS131E08 44 #endif #endif AWBL_HWCONF_ADC_ADS131E08 AW_DEV_ADC_ADS131E08 AWBL_HWCONF_ADC_ADS131E aw_const struct awbl_devhcf g_awbl_devhcf_list[] = { /* */ 2 /*... */ 3 AWBL_HWCONF_ADC_ADS131E08 /* ADS131E08 */ 4 /*... */ 5 }; AWBL_HWCONF_ADC_ADS131E08 awbl_hwconf_adc_ads131e08.h 469

483 ADS131E08 ADS131E08 ADC 7.23 A/D ADS131E08 8 A/D 24 ~ 31 ADC 24 ~ 31 ADS131E08 ADC ADS131E08 A/D 0 24ADS131E08 ADS131E08 IN ADS131E08 1 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_adc.h" 5 6 #define N_SAMPLES_PER_READ 100 // static uint32_t g_adc_val[n_samples_per_read]; // 9 10 int aw_main() 11 { 12 uint32_t sum = 0; 13 uint32_t code; 14 int vol; 15 int i; 16 int bits = aw_adc_bits_get(24); 17 int vref = aw_adc_vref_get(24); if ((bits < 0) vref < 0) { 20 aw_kprintf("adc info get failed!\r\n"); 21 while (1) { 22 aw_mdelay(1000); 23 } 24 } 25 while (1) { 26 aw_adc_sync_read(24, g_adc_val, N_SAMPLES_PER_READ, FALSE); 27 sum = 0; 28 for (i = 0; i < 100; i++) { 29 sum += g_adc_val[i]; 30 } 470

484 31 code = sum / 100; 32 vol = (float)(code * vref) / (float)(1 << bits); 33 aw_kprintf("the vol of channel 24 is : %d mv \r\n", vol); 34 aw_mdelay(1000); 35 } 36 } uint16_t uint32_t ADC app_adc_sync_read.c 1 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "aw_vdebug.h" 4 #include "aw_adc.h" 5 6 #define N_SAMPLES_PER_READ 100 // static uint32_t g_adc_val[n_samples_per_read]; // 9 10 int app_adc_sync_read (int ch) 11 { 12 uint32_t sum = 0; 13 uint32_t code; 14 int vol; 15 int i; 16 int bits = aw_adc_bits_get(ch); 17 int vref = aw_adc_vref_get(ch); if ((bits < 0) vref < 0) { 20 aw_kprintf("adc info get failed!\r\n"); 21 return -AW_EIO; 22 } 23 while (1) { 24 aw_adc_sync_read(ch, g_adc_val, N_SAMPLES_PER_READ, FALSE); 25 sum = 0; /* ADC */ 28 if (bits <= 8) { 29 for (i = 0; i < 100; i++) { 30 sum += ((uint8_t *) g_adc_val)[i]; 31 } 471

485 32 } else if (bits <= 16) { 33 for (i = 0; i < 100; i++) { 34 sum += ((uint16_t *) g_adc_val)[i]; 35 } 36 } else { 37 for (i = 0; i < 100; i++) { 38 sum += ((uint32_t *) g_adc_val)[i]; 39 } 40 } 41 code = sum / 100; 42 vol = (float)(code * vref) / (float)(1 << bits); 43 aw_kprintf("the vol of channel %d is : %d mv \r\n", ch, vol); 44 aw_mdelay(1000); 45 } 46 } 32 if for ADC app_adc_sync_read.h 1 #pragma once 2 #include "aworks.h" 3 4 int app_adc_sync_read (int ch); demo ADC MCU A/D app_adc_sync_read.c i.mx28x ADC ADC 0 1 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "app_adc_sync_read.h" 4 5 int aw_main (void) 6 { 7 app_adc_sync_read(0); 8 while(1) { 9 aw_mdelay(1000); 10 } 11 } 472

486 i.mx28x ADC A/D ADS131E ADC 24 1 #include "aworks.h" 2 #include "aw_delay.h" 3 #include "app_adc_sync_read.h" 4 5 int aw_main (void) 6 { 7 app_adc_sync_read(24); 8 while(1) { 9 aw_mdelay(1000); 10 } 11 } A/D A/D A/D A/D 0 ~ 7 A/D 0 2 ADS131E08 DRDY 8 8 A/D ADC #include "aworks.h" 2 #include "aw_adc.h" 3 4 static aw_adc_client_t g_client[8]; 5 static aw_adc_buf_desc_t g_buf_desc[8]; 6 static uint32_t g_buf[8][100]; // ADC uint32_t 7 8 static void buf_complete (void *p_cookie, aw_err_t state) 9 { 10 int ch = (int)p_cookie; // p_arg // ch g_buf[ch - 24] 13 // 14 aw_adc_client_start(& g_client[ch - 24], & g_buf_desc[ch - 24], 1, 1); 15 } int aw_main (void) 473

487 18 { 19 int i; 20 for (i = 0; i < 8; i++) { 21 aw_adc_client_init(& g_client[i], i, FALSE); // 22 // 23 aw_adc_mkbufdesc(& g_buf_desc[i], g_buf[i], 100, buf_complete, (void *)(24 + i)); 24 aw_adc_client_start(& g_client[i], & g_buf_desc[i], 1, 1); 25 } 26 // 27 } 8 DRDY buf_complete buf_complete ADC 1 #include "aworks.h" 2 #include "aw_adc.h" 3 #include "aw_msgq.h" 4 5 AW_MSGQ_DECL_STATIC(msgq_adc, 20, sizeof(int)); //, 6 7 static aw_adc_client_t g_client[8]; 8 static aw_adc_buf_desc_t g_buf_desc[8]; 9 static uint32_t g_buf[8][100]; // ADC uint32_t static void buf_complete (void *p_cookie, aw_err_t state) 12 { 13 int ch = (int)p_cookie; // p_arg 14 AW_MSGQ_SEND(msgq_adc, 15 &ch, 16 sizeof(int), 17 AW_MSGQ_NO_WAIT, 18 AW_MSGQ_PRI_NORMAL); 19 } int aw_main (void) 22 { 23 int ch; 474

488 24 int err; 25 int i; AW_MSGQ_INIT(msgq_adc, 20, sizeof(int), AW_MSGQ_Q_PRIORITY); 28 for (i = 0; i < 8; i++) { 29 aw_adc_client_init(& g_client[i], 24 + i, FALSE); //, // 31 aw_adc_mkbufdesc(& g_buf_desc[i], g_buf[i], 100, buf_complete, (void *)(24 + i)); 32 aw_adc_client_start(& g_client[i], & g_buf_desc[i], 1, 1); 33 } while(1) { 36 err = AW_MSGQ_RECEIVE(msgq_adc, &ch, sizeof(int), AW_MSGQ_WAIT_FOREVER); 37 if (err == AW_OK) { // ch 39 // g_buf[ch - 24] 40 // 41 aw_adc_client_start(& g_client[ch - 24], & g_buf_desc[ch - 24], 1, 1); 42 } 43 } 44 } buf_complete() 15.6 AD5689RD/A 7.7 D/A i.mx28x MCU DAC i.mx28x MCU DAC DAC AD5689R D/A AD5689R 16 D/A SPI 50 MHz 1 (INL)16 2 LSB 2.5 V 2 ppm/ (TUE)0.1% FSR 1.5 mv 0.1% FSR 20 ma0.5 V 1 2GAIN 1.8 V 0 475

489 0.5 nv-sec 3.3 mw (3 V) 2.7 V 5.5 V 40 C +105 C 16-lead LFCSPTSSOP 2 AD5689R 16 TSSOP AD5689R AD5689R Vref 1 AD5689R GND 4 VDD 5 2.7V ~ 5.5V VoutA 3 DAC A VoutB 7 DAC B SDO 8 SDO SDIN SDO SDIN 14 /SYNC 13 SPI SCLK 12 VLOGIC V ~ 5.5V GAIN 10 GND 1 0 ~ Vref Vref VLOGIC 2 0 ~ 2*Vref 2*Vref /LDAC 9 DAC DAC /RESET 15 RSTSEL 16 GND DAC 0 VLOGIC DAC NC 26 3 AD5689R D/A

490 15.18 AD5689R V LOGIC VCC J1 GAIN GND 1 GAIN V LOGIC 2 4 AD5689R MCU SPI SYNCSCLK SDIN D/A SDO AD5689R 24 MSB DB23C0 ~ C3 DAC A DAC B 0 4 DAC 16 DAC AWorks AD5689R DAC DAC AWorks AD5689R AD5689R AWorks AWBus-lite AWBus-lite 6 1 AD5689R AD5689R awbl_dac_ad5689r.h

491 15.85 AD5689R 1 #define AWBL_AD5689R_NAME "awbl_dac_ad5689r" AWBL_AD5689R_NAME 2 AD5689R 0 3 AD5689R SPI SPI, AWBL_BUSID_SPI 4 AD5689R SPI SPI SPI aw_prj_params.h i.mx28x 5 SPI SSP0 ~ SSP3GPIO SPI SPI 1 #define IMX28_SSP0_BUSID 0 2 #define IMX28_SSP1_BUSID 1 3 #define IMX28_SSP2_BUSID 2 4 #define IMX28_SSP3_BUSID 3 5 #define GPIO_SPI0_BUSID 4 GPIO SPI GPIO_SPI0_BUSID 5 awbl_dac_ad5689r.h AD5689R struct awbl_dac_ad5689r_dev AD5689R 1 aw_local struct awbl_dac_ad5689r_dev g_dac_ad5689r_dev; g_dac_ad5689r_dev p_dev 6 awbl_dac_ad5689r.h AD5689R struct awbl_dac_ad5689r_devinfo struct awbl_dac_ad5689r_devinfo 1 typedef struct awbl_dac_ad5689r_devinfo { 2 struct awbl_dac_servinfo dac_servinfo; // DAC 3 uint8_t bits; // DAC 4 uint32_t e_vref; // mv 0 5 int gain; // 1 2 GAIN 6 uint32_t spi_speed; // SPI 7 int spi_cs_pin; // SPI CS 478

492 8 void (*pfn_plfm_init) (void); // 9 } awbl_dac_ad5689r_devinfo_t; dac_servinfo DAC DAC DAC ch struct awbl_dac_servinfo struct awbl_dac_servinfo 1 struct awbl_dac_servinfo { 2 aw_dac_channel_t ch_min; 3 aw_dac_channel_t ch_max; 4 }; ch_min DAC ch_max DAC AD5689R DAC AD5689R 0 1 ch_min 0ch_max 1 DAC AD5689R AD5689R 0 ~ 1 AD5689R ~ 3 bits DAC AD5689R e_vref mv AD5689R e_vref e_vref 02.5V gain D/A 1 0 ~ Vref 2 0 ~ Vref 0 ~ 2 * Vref GAIN #10 GAIN GND 1 GAIN V LOGIC 2DAC DAC vref GAIN aw_dac_vref_get() vref GAIN Vref * GAIN D/A Vref spi_speed SPI AD5689R 50M spi_speed MCU SPI 6MHz Hz SPI spi_cs_pin AD5678R SYNC#13 i.mx28x PIO2_19 AD5689R cs_pin PIO2_19 pfn_plfm_init 479

493 NULL AD5689R 1 aw_local aw_const struct awbl_dac_ad5689r_devinfo g_dac_ad5689r_devinfo = { 2 { 3 0, // 4 1 // 5 }, 6 16, // DAC 16bit 7 0, // // GAIN GND , // SPI 10 PIO2_19, // SPI CS 11 NULL 12 }; AD5689R AD5689R awbl_hwconf_dac_ad5689r.h 1 #ifndef AWBL_HWCONF_DAC_AD5689R_H 2 #define AWBL_HWCONF_DAC_AD5689R_H 3 #ifdef AW_DEV_DAC_AD5689R 4 5 #include "driver/dac/awbl_dac_ad5689r.h" 6 7 #define DAC_SPI_DEV_CS_PIN PIO2_19 // DAC SPI CS 8 9 aw_local aw_const struct awbl_dac_ad5689r_devinfo g_dac_ad5689r_devinfo = { 10 { 11 0, // 12 1 // 13 }, 14 16, // DAC 16bit 15 0, // // GAIN GND , // SPI 18 DAC_SPI_DEV_CS_PIN, // SPI CS 19 NULL 20 }; /* */ 23 aw_local struct awbl_dac_ad5689r_dev g_dac_ad5689r_dev; 480

494 24 25 #define AWBL_HWCONF_DAC_AD5689R \ 26 { \ 27 AWBL_AD5689R_NAME, \ 28 0, \ 29 AWBL_BUSID_SPI, \ 30 GPIO_SPI0_BUSID, \ 31 (struct awbl_dev *)& g_dac_ad5689r_dev, \ 32 &( g_dac_ad5689r_devinfo) \ 33 }, 34 #else 35 #define AWBL_HWCONF_DAC_AD5689R 36 #endif /* AW_DEV_DAC_AD5689R */ #endif /* AWBL_HWCONF_DAC_AD5689R_H */ AWBL_HWCONF_DAC_AD5689R AW_DEV_DAC_AD5689R AWBL_HWCONF_DAC_AD5689R aw_const struct awbl_devhcf g_awbl_devhcf_list[] = { /* */ 2 /*... */ 3 AWBL_HWCONF_DAC_AD5689R /* AD5689R */ 4 /*... */ 5 }; AWBL_HWCONF_DAC_AD5689R awbl_hwconf_dac_ad5689r.h AD5689R AD5689R DAC 7.24 D/A AD5689R 2 D/A 0 1 DAC 0 1 AD5689R AD5689R 1 #include "aworks.h" 2 #include "aw_vdebug.h" 3 #include "aw_delay.h" 4 #include "aw_dac.h" 5 6 int aw_main(void) 7 { 481

495 8 uint8_t bits = 0; 9 int vref = 0; aw_dac_enable(0); // DAC 0 12 aw_dac_enable(1); // DAC 0 13 bits = aw_dac_bits_get(0); // DAC 14 vref = aw_dac_vref_get(0); // DAC aw_kprintf("the DAC bits is %d \r\n", bits); 17 aw_kprintf("the DAC vref is %d \r\n", vref); aw_dac_mv_set(0, 1000); // DAC 0 1V 20 aw_dac_mv_set(1, 2000); // DAC 0 2V aw_mdelay(10 * 1000); // 10S aw_dac_disable(0); // DAC 0 25 aw_dac_disable(1); // DAC while(1) { 28 // 29 } 30 } 482

496

497

498

修订历史版本 日期 原因 V /12/06 创建文档 V /01/13 正式发布 V /06/12 修改文档图片及题注 V /06/21 修改机械尺寸图片 1. 修改 产品型号命名规则 图片 ; V /08/06 2.

修订历史版本 日期 原因 V /12/06 创建文档 V /01/13 正式发布 V /06/12 修改文档图片及题注 V /06/21 修改机械尺寸图片 1. 修改 产品型号命名规则 图片 ; V /08/06 2. DataSheet DS01010101 V1.05 Date: 2018/09/05 概述 M6G2C 系列核心板是基于 NXP i.mx6ul 处理器为核心的嵌入式工业控制核心板 核心板采用性能更优的 Cortex-A7 内核处理器, 可提供快速的数据处理和流畅的界面切换 该系列产品自带 8 路 UART 2 路 USB OTG 最高 2 路 CAN-bus 2 路以太网等接口, 具有十分强大的工业控制通讯接口,

More information

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCAB5D1E9CAD2B7BDB0B82E646F63>

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCAB5D1E9CAD2B7BDB0B82E646F63> 目 录 一 嵌 入 式 系 统 的 应 用 及 前 景... - 1 - 二 目 前 嵌 入 式 系 统 教 学 现 状 和 实 验 体 系 的 建 设... - 1 - 三 嵌 入 式 教 学 在 本 科 生 中 的 教 学 难 点... - 1 - 四 教 学 难 点 解 决 方 法... - 2-1 选 择 S+core7 核 学 习... - 2-2 选 择 ecos 操 作 系 统 进 行

More information

ESP32-WROOM URL Wi-Fi Wi-Fi Bluetooth SIG 2018

ESP32-WROOM URL Wi-Fi Wi-Fi Bluetooth SIG 2018 ESP32-WROOM-32 2.6 2018 www.espressif.com ESP32-WROOM-32 www.espressif.com/zh-hans/subscribe www.espressif.com/zh-hans/certificates URL Wi-Fi Wi-Fi Bluetooth SIG 2018 1 1 2 3 2.1 3 2.2 3 2.3 Strapping

More information

M335x 核心板 修订历史 版本日期原因 V /04/27 正式发布 i

M335x 核心板 修订历史 版本日期原因 V /04/27 正式发布 i Data Sheet M335x-T( 可插拔 ) 核心板数据手册 ARM 嵌入式工业控制模块 DS01010101 V1.00 Date: 2016/04/27 概述 M335x-T 是一款基于 TI AM335x 处理器的嵌入式工控核心板 800MHz 主频的 Cortex-A8 内核性能远强于 ARM9, 可提供快速的数据处理和流畅的界面切换 M335x-T 拥有丰富的外设资源,6 路 UART

More information

A3352 核心板 修订历史版本 日期 原因 V /12/04 创建文档 V /09/20 修改文中错误 增加 A3352 上电时序 V /06/19 修改文中错误 增加启动配置 删除 WinCE 相关信息 V /08/03 修改公司名

A3352 核心板 修订历史版本 日期 原因 V /12/04 创建文档 V /09/20 修改文中错误 增加 A3352 上电时序 V /06/19 修改文中错误 增加启动配置 删除 WinCE 相关信息 V /08/03 修改公司名 Data Sheet A3352 无线核心板数据手册 DS01010101 V1.03 Date: 2017/08/03 概述 A3352 是一款基于 TI AM3352 处理器为核心, 集无线模块为一体的嵌入式无线核心板 800MHz 主频的 Cortex-A8 内核性能远强于 ARM9, 可提供快速的数据处理和流畅的界面切换 A3352 拥有丰富的外设资源, 如 6 路 UART 2 路 CAN-Bus

More information

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6BFBCCAD4B4F3B8D92E646F63>

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6BFBCCAD4B4F3B8D92E646F63> 嵌 入 式 系 统 设 计 师 考 试 大 纲 一 考 试 说 明 1 考 试 要 求 : (1) 掌 握 科 学 基 础 知 识 ; (2) 掌 握 嵌 入 式 系 统 的 硬 件 软 件 知 识 ; (3) 掌 握 嵌 入 式 系 统 分 析 的 方 法 ; (4) 掌 握 嵌 入 式 系 统 设 计 与 开 发 的 方 法 及 步 骤 ; (5) 掌 握 嵌 入 式 系 统 实 施 的 方 法

More information

ESP32-WROOM-32D ESP32-WROOM-32U URL Wi-Fi Wi-Fi Bluetooth SIG 208

ESP32-WROOM-32D ESP32-WROOM-32U     URL Wi-Fi Wi-Fi Bluetooth SIG 208 ESP32-WROOM-32D & ESP32-WROOM-32U.7 208 www.espressif.com ESP32-WROOM-32D ESP32-WROOM-32U www.espressif.com/zh-hans/subscribe www.espressif.com/zh-hans/certificates URL Wi-Fi Wi-Fi Bluetooth SIG 208 2

More information

ESP3-WROVER URL Wi-Fi Wi-Fi Bluetooth SIG 08

ESP3-WROVER     URL Wi-Fi Wi-Fi Bluetooth SIG 08 ESP3-WROVER.0 08 www.espressif.com ESP3-WROVER www.espressif.com/zh-hans/subscribe www.espressif.com/zh-hans/certificates URL Wi-Fi Wi-Fi Bluetooth SIG 08 3. 3. 4.3 Strapping 5 3 7 3. CPU 7 3. Flash SRAM

More information

网上对外发布资料适用版本

网上对外发布资料适用版本 HDLC-LCM 嵌 入 式 低 功 耗 通 信 模 块 Rev.2016.0602 用 户 手 册 电 话 :400-025-5057 网 址 :www.yacer.cn 目 录 1 概 述... 1 1.1 简 介... 1 1.2 特 点... 1 1.3 应 用... 1 1.4 订 购 信 息... 1 1.5 技 术 规 格... 2 1.6 机 械 尺 寸 图... 3 2 硬 件 结

More information

,,, PCB, AR M VxWorks DSP,,,,,,,,,,, (CIP) /,,.:,2005 ISBN TP36 CIP (2005) : ( 10 ) : : (010 ) : (010)

,,, PCB, AR M VxWorks DSP,,,,,,,,,,, (CIP) /,,.:,2005 ISBN TP36 CIP (2005) : ( 10 ) : : (010 ) : (010) ,,, PCB, AR M VxWorks DSP,,,,,,,,,,, (CIP) /,,.:,2005 ISBN 7-5635-1099-0...............TP36 CIP (2005)076733 : ( 10 ) :100876 : (010 )62282185 : (010)62283578 : publish@bupt.edu.cn : : : 787 mm960 mm 1/

More information

Microsoft Word - 正文.doc

Microsoft Word - 正文.doc 1 2 1 2 3 4 5 6 7 8 9 10 3 1 150 2 150 1 1 1.1 1.1.1 1.2 1.2.1 1.2.2 1.2.3 1.3 1.3.1 1.3.2 1.4 1.4.1 CPU 1.4.2 I/O 1.4.3 I/O 1.5 1.5.1 CISC RISC 1.5.2 1.5.3 1.6 1.6.1 1.6.2 N 1.6.3 2 2.1 2.1.1 2.1.2 2.1.3

More information

Data Sheet M3352 核心板产品数据手册 ARM 嵌入式工业控制模块 DS V1.05 Date: 2015/08/10 产品数据手册 概述 M3352 是一款基于 AM3352 处理器的嵌入式工控核心板 800MHz 主频的 Cortex-A8 内核性能远强于 ARM9

Data Sheet M3352 核心板产品数据手册 ARM 嵌入式工业控制模块 DS V1.05 Date: 2015/08/10 产品数据手册 概述 M3352 是一款基于 AM3352 处理器的嵌入式工控核心板 800MHz 主频的 Cortex-A8 内核性能远强于 ARM9 Data Sheet DS01010101 V1.05 Date: 2015/08/10 概述 M3352 是一款基于 AM3352 处理器的嵌入式工控核心板 800MHz 主频的 Cortex-A8 内核性能远强于 ARM9, 可提供快速的数据处理和流畅的界面切换 该产品自带 6 路 UART 2 路 CAN-Bus 2 路 USB OTG 2 路以太网等接口, 具有强大的通讯功能 工业级性能保证,

More information

STM32 STM3232ARM Cortex-M3 Cortex-M3 STM32Thumb-2 STM32MCU Cortex-M3ARM MCU STM32ARM 32 ARMCortex-M3 32 STM32 Cortex-M3 ARM Cortex-M3 ARM ARM

STM32 STM3232ARM Cortex-M3 Cortex-M3 STM32Thumb-2 STM32MCU Cortex-M3ARM MCU STM32ARM 32 ARMCortex-M3 32 STM32 Cortex-M3 ARM Cortex-M3 ARM ARM STM32 ARM Cortex -M3 32 www.st.com/mcu www.stmicroelectronics.com.cn/mcu STM32 STM3232ARM Cortex-M3 Cortex-M3 STM32Thumb-2 STM32MCU 32 1632 Cortex-M3ARM MCU STM32ARM 32 ARMCortex-M3 32 STM32 Cortex-M3

More information

Ch03_嵌入式作業系統建置_01

Ch03_嵌入式作業系統建置_01 Chapter 3 CPU Motorola DragonBall ( Palm PDA) MIPS ( CPU) Hitachi SH (Sega DreamCast CPU) ARM StrongARM CPU CPU RISC (reduced instruction set computer ) CISC (complex instruction set computer ) DSP(digital

More information

江苏宁沪高速公路股份有限公司.PDF

江苏宁沪高速公路股份有限公司.PDF - 1 - - 2 - - 3 - - 4 - - 5 - - 6 - - 7 - - 8 - 33.33% ( ) ( ) ( ) 33.33% ( ) ( ) ( ) 1 1 1992 8 3200001100976 1997 6 27 H 12.22 2001 1 16 A 1.5 2001 12 3 503,774.75 14,914,399,845.00 13,445,370,274.00

More information

Microsoft Word - MP2018_Report_Chi _12Apr2012_.doc

Microsoft Word - MP2018_Report_Chi _12Apr2012_.doc 人 力 資 源 推 算 報 告 香 港 特 別 行 政 區 政 府 二 零 一 二 年 四 月 此 頁 刻 意 留 空 - 2 - 目 錄 頁 前 言 詞 彙 縮 寫 及 注 意 事 項 摘 要 第 一 章 : 第 二 章 : 第 三 章 : 第 四 章 : 附 件 一 : 附 件 二 : 附 件 三 : 附 件 四 : 附 件 五 : 附 件 六 : 附 件 七 : 引 言 及 技 術 大 綱 人

More information

南華大學數位論文

南華大學數位論文 1 i -------------------------------------------------- ii iii iv v vi vii 36~39 108 viii 15 108 ix 1 2 3 30 1 ~43 2 3 ~16 1 2 4 4 5 3 6 8 6 4 4 7 15 8 ----- 5 94 4 5 6 43 10 78 9 7 10 11 12 10 11 12 9137

More information

李天命的思考藝術

李天命的思考藝術 ii iii iv v vi vii viii ix x 3 1 2 3 4 4 5 6 7 8 9 5 10 1 2 11 6 12 13 7 8 14 15 16 17 18 9 19 20 21 22 10 23 24 23 11 25 26 7 27 28 12 13 29 30 31 28 32 14 33 34 35 36 5 15 3 1 2 3 4 5 6 7 8 9 10 11

More information

皮肤病防治.doc

皮肤病防治.doc ...1...1...2...3...4...5...6...7...7...9...10... 11...12...14...15...16...18...19...21 I ...22...22...24...25...26...27...27...29...30...31...32...33...34...34...36...36...37...38...40...41...41...42 II

More information

性病防治

性病防治 ...1...2...3...4...5...5...6...7...7...7...8...8...9...9...10...10... 11... 11 I ...12...12...12...13...14...14...15...17...20...20...21...22...23...23...25...27...33...34...34...35...35 II ...36...38...39...40...41...44...49...49...53...56...57...57...58...58...59...60...60...63...63...65...66

More information

中国南北特色风味名菜 _一)

中国南北特色风味名菜 _一) ...1...1...2...3...3...4...5...6...7...7...8...9... 10... 11... 13... 13... 14... 16... 17 I ... 18... 19... 20... 21... 22... 23... 24... 25... 27... 28... 29... 30... 32... 33... 34... 35... 36... 37...

More information

全唐诗24

全唐诗24 ... 1... 1... 2... 2... 3... 3... 4... 4... 5... 5... 6... 6... 7... 7... 8... 8... 9... 9...10...10...10...11...12...12...12...13...13 I II...14...14...14...15...15...15...16...16...16...17...17...18...18...18...19...19...19...20...20...20...21...21...22...22...23...23...23...24

More information

509 (ii) (iii) (iv) (v) 200, , , , C 57

509 (ii) (iii) (iv) (v) 200, , , , C 57 59 (ii) (iii) (iv) (v) 500,000 500,000 59I 18 (ii) (iii) (iv) 200,000 56 509 (ii) (iii) (iv) (v) 200,000 200,000 200,000 500,000 57 43C 57 (ii) 60 90 14 5 50,000 43F 43C (ii) 282 24 40(1B) 24 40(1) 58

More information

2005.book

2005.book ...4... 4... 7...10... 10... 10... 10... 10... 11... 11 PCC... 11 TB170... 12 /... 12...13... 13 BP150 / BP151 / BP152 / BP155... 14...15... 15... 15... 15... 15... 15... 15... 16 PS465 / PS477... 17 PS692

More information

WON1200 规格书 Author:Wonhere Rev:0.22 Date:2015-May

WON1200 规格书 Author:Wonhere Rev:0.22 Date:2015-May WON1200 规格书 Author:Wonhere Rev:0.22 Date:2015-May-13 1 Revision History 0.2, 增加 J2 的 PIN57 PIN59 说明 0.21,2014-Feb-17 去掉表格中的 HDMI 接口 修改 SPI 个数, 只有 1 个 SPI 接口 修改 硬件参数 表格 增加备注 关于 MMC1_DAT4-7 被替换 0.22, 增加

More information

FM1935X智能非接触读写器芯片

FM1935X智能非接触读写器芯片 FM33A0xx MCU 2017. 05 2.0 1 (http://www.fmsh.com/) 2.0 2 ... 3 1... 4 1.1... 4 1.2... 4 1.3... 5 1.3.1... 5 1.3.2... 5 1.4... 8 1.4.1 LQFP100... 8 1.4.2 LQFP80... 9 1.4.3... 9 2... 15 2.1 LQFP100... 15

More information

Data Sheet M3352-YP( 邮票孔 ) 核心板数据手册 ARM 嵌入式工业控制模块 DS V1.06 Date: 2015/10/26 产品数据手册 概述 M3352-YP 是一款基于 AM3352 处理器的嵌入式工控核心板 800MHz 主频的 Cortex-A8 内

Data Sheet M3352-YP( 邮票孔 ) 核心板数据手册 ARM 嵌入式工业控制模块 DS V1.06 Date: 2015/10/26 产品数据手册 概述 M3352-YP 是一款基于 AM3352 处理器的嵌入式工控核心板 800MHz 主频的 Cortex-A8 内 Data Sheet M3352-YP( 邮票孔 ) 核心板数据手册 ARM 嵌入式工业控制模块 DS01010101 V1.06 Date: 2015/10/26 概述 M3352-YP 是一款基于 AM3352 处理器的嵌入式工控核心板 800MHz 主频的 Cortex-A8 内核性能远强于 ARM9, 可提供快速的数据处理和流畅的界面切换 该产品自带 6 路 UART 2 路 CAN-Bus

More information

95年度技術學院評鑑

95年度技術學院評鑑 大 漢 技 術 學 院 104 學 年 度 技 術 學 院 綜 合 評 鑑 電 腦 與 通 訊 工 程 系 自 我 評 鑑 報 告 受 評 單 位 組 別 電 子 電 機 群 ( 電 機 組 ) 校 長 宋 佩 瑄 簽 章 ( 請 蓋 關 防 ) 主 管 林 中 誠 簽 章 聯 絡 人 資 訊 姓 名 林 中 誠 職 級 副 教 授 電 話 03-8210873 傳 真 03-8264113 手 機

More information

KL DSC DEMO 使用说明

KL DSC DEMO 使用说明 :0755-82556825 83239613 : (0755)83239613 : http://www.kingbirdnet.com EMAIL Good989@163.com 1 1 KB3000 DTU... 3 1.1... 3 1.2... 3 1.3... 3 1.4... 3 2... 4 2.1 GSM/GPRS... 4 2.2... 4 2.3... 5 2.4... 6 2.5...

More information

捕捉儿童敏感期

捕捉儿童敏感期 目弽 2010 捕捉儿童敏感期 I a mao 2010-3-27 整理 早教资料每日分享 http://user.qzone.qq.com/2637884895 目弽 目彔 目弽... I 出版前言... - 1 竨一章 4 丢孝子癿敂感朏敀乞... - 1 - 妞妞 0 4 岁 海颖 妞妞癿妈妈... - 1 黑白相亝癿地斱... - 1 斵转... - 2 就丌要新帰子... - 2 小霸王...

More information

<4D6963726F736F667420576F7264202D2031303130315FB971BEF7BB50B971A46CB8735FB773A55FA5ABA5DFB7E7AADAB0AAAFC5A475B77EC2BEB77EBEC7AED55FA97EAE61C0F4B9D2B4BCBC7AB1B1A8EEA874B2CE2E646F63>

<4D6963726F736F667420576F7264202D2031303130315FB971BEF7BB50B971A46CB8735FB773A55FA5ABA5DFB7E7AADAB0AAAFC5A475B77EC2BEB77EBEC7AED55FA97EAE61C0F4B9D2B4BCBC7AB1B1A8EEA874B2CE2E646F63> 全 國 高 職 學 生 102 年 度 專 題 製 作 競 賽 報 告 書 居 家 環 境 智 慧 控 制 系 統 群 別 : 電 機 與 電 子 群 參 賽 作 品 名 稱 : 居 家 環 境 智 慧 控 制 系 統 關 鍵 詞 : 環 境 監 控 ZigBee 感 測 元 件 目 錄 壹 摘 要... 2 貳 研 究 動 機...2 參 研 究 方 法...3 一 研 究 器 材...3 二 研

More information

SMART 7P 0 HR7P OTPMCU A/D I/O OTP ROM RAM HR7P HR7P HR7PPMB MSOP0 7+input HR7PPSC HR7PPSD SOP SOP6 +input input HR7PERB SSOP0 7

SMART 7P 0 HR7P OTPMCU A/D I/O OTP ROM RAM HR7P HR7P HR7PPMB MSOP0 7+input HR7PPSC HR7PPSD SOP SOP6 +input input HR7PERB SSOP0 7 上海东软载波微电子有限公司 SMART www.essemi.com SMART 7P 0 HR7P OTPMCU A/D I/O OTP ROM RAM HR7P HR7P HR7PPMB MSOP0 7+input 06 6 6 HR7PPSC HR7PPSD SOP SOP6 +input 06 6 +input 06 6 6 6 HR7PERB SSOP0 7+input 06 6 6 HR7PESC

More information

cgn

cgn 3654 ( 571 ) 88(4) 2014 3 31 10766 10778 2014 3 31 ( ) 2 21 ( ) 2014 3 31 10768 10778 6 9 1. ( ) 2. 3. 4. 5. 2014 6 3 ( ) 10768 10778 ( ) 2014 3 31 ( 622 ) 11 80 2014 3 31 2014 6 3 10 8 2014 3 31 ( ) 2014

More information

「香港中學文言文課程的設計與教學」單元設計範本

「香港中學文言文課程的設計與教學」單元設計範本 1. 2. 3. (1) (6) ( 21-52 ) (7) (12) (13) (16) (17) (20) (21) (24) (25) (31) (32) (58) 1 2 2007-2018 7 () 3 (1070) (1019-1086) 4 () () () () 5 () () 6 21 1. 2. 3. 1. 2. 3. 4. 5. 6. 7. 8. 9. ( ) 7 1. 2.

More information

全唐诗28

全唐诗28 ... 1... 1... 1... 2... 2... 2... 3... 3... 4... 4... 4... 5... 5... 5... 5... 6... 6... 6... 6... 7... 7... 7... 7... 8... 8 I II... 8... 9... 9... 9...10...10...10...11...11...11...11...12...12...12...13...13...13...14...14...14...15...15...15...16...16...16...17...17

More information

穨學前教育課程指引.PDF

穨學前教育課程指引.PDF i 1 1.1 1 1.2 1 4 2.1 4 2.2 5 2.3 7 2.4 9 2.5 11 2.6 1 2 1 5 3.1 1 5 3.2 1 5 19 4.1 19 4.2 19 4.3 2 1 4.4 29 4.5 38 4.6 4 3 4.7 47 50 5.1 5 0 5.2 5 0 5.3 6 2 5.4 9 4 5.5 1 2 6 ( ) 1 2 7 ( ) 1 31 ( ) 1

More information

<4D6963726F736F667420576F7264202D20B5E7D7D3D0C5CFA2C0E0D7A8D2B5C5E0D1F8B7BDB0B8D0DEB6C1D6B8C4CF2E646F63>

<4D6963726F736F667420576F7264202D20B5E7D7D3D0C5CFA2C0E0D7A8D2B5C5E0D1F8B7BDB0B8D0DEB6C1D6B8C4CF2E646F63> 福 州 大 学 校 训 博 学 远 志 明 德 至 诚 序 言 亲 爱 的 电 子 信 息 类 的 学 子 : 朝 气 蓬 勃 的 你 们 带 着 对 大 学 生 活 的 美 好 憧 憬 走 进 校 园, 开 始 谱 写 人 生 历 程 崭 新 辉 煌 的 一 页 你 们 将 在 这 风 景 如 画 的 福 州 大 学 新 校 区 里, 与 周 围 的 同 学 们 一 起 汲 取 知 识 培 养 能

More information

2 12

2 12 SHENZHEN BRILLIANT CRYSTAL TECHNOLOGIC CO.,LTD. The specification for the following models Graphic LCM serial communication control board CB001 PROPOSED BY APPROVED Design Approved TEL:+86-755-29995238

More information

眼病防治

眼病防治 ( 20 010010) 787 1092 1/32 498.50 4 980 2004 9 1 2004 9 1 1 1 000 ISBN 7-204-05940-9/R 019 1880.00 ( 20.00 ) ...1...1...2...3...5...5...6...7...9... 11...13...14...15...17...18...19...20...21 I II...21...22...23...24...25...27...27...28...29...30...31...33...33...34...36...38...39...40...41...42...43...45

More information

中国南北特色风味名菜 _八)

中国南北特色风味名菜 _八) ( 20 010010) 7871092 1/32 356.25 4 760 2004 8 1 2004 8 1 11 000 ISBN 7-204-05943-3/Z102 1026.00 ( 18.00 ) ...1...2...2...4...6...7...8...9... 10... 11... 12... 13... 13... 14... 15... 17... 18... 19...

More information

版权声明 龙芯 免责声明 据 龙芯 2 Building No.2, Loongson Industrial Park, Zhongguancun Environmental Protection Park (Tel) (Fax)

版权声明 龙芯 免责声明 据 龙芯 2 Building No.2, Loongson Industrial Park, Zhongguancun Environmental Protection Park (Tel) (Fax) 2018 9 29 龙芯 版权声明 龙芯 免责声明 据 龙芯 2 Building No.2, Loongson Industrial Park, Zhongguancun Environmental Protection Park (Tel) 010-62546668 (Fax) 010-62600826 阅读指南 龙芯 1C101 处理器数据手册 龙芯 1C101 修订历史 序号 更新日期 版本号

More information

VME

VME VMEbus VME 35 VME VME VME EOL Tsi148 VME PCI-X Marvell 2025 VME Power Architecture VME VME VME VME VME VME VME PCI VME VME VME 32 32 CPU I/O VME VMEbus 20 70 VERSAbus European Microsystems group VERSAbus

More information

穨ecr2_c.PDF

穨ecr2_c.PDF i ii iii iv v vi vii viii 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 26 27 2 28 29 30 31 32 33 34 35 36 37 38 39 40 3 4 41 42 43 5 44 45 46 6 47 48 49 50 51 52 1 53 2 54 55 3 56

More information

電腦相關罪行跨部門工作小組-報告書

電腦相關罪行跨部門工作小組-報告書 - ii - - iii - - iv - - v - - vi - - vii - - viii - (1) 2.1 (2) (3) 13.6 (4) 1.6 (5) 21 (6) (7) 210 (8) (9) (10) (11) ( ) ( 12) 20 60 16 (13) ( ) (

More information

i

i i ii iii iv v vi vii viii ===== 1 2 3 4 5 6 7 8 9 10 ==== 11 12 13 14 15 16 17 18 19 ==== ==== 20 .. ===== ===== ===== ===== ===== ======.. 21 22 ===== ===== ===== ===== 23 24 25 26 27 28 29 ==== ====

More information

发展党员工作手册

发展党员工作手册 发 展 党 员 工 作 问 答 目 录 一 总 论...9 1. 发 展 党 员 工 作 的 方 针 是 什 么? 如 何 正 确 理 解 这 个 方 针?... 9 2. 为 什 么 强 调 发 展 党 员 必 须 保 证 质 量?... 9 3. 如 何 做 到 慎 重 发 展?... 10 4. 如 何 处 理 好 发 展 党 员 工 作 中 的 重 点 与 一 般 的 关 系?...11 5.

More information

i

i 9 1 2 3 4 i 5 6 ii iii iv v vi vii viii 1 1 1 2 3 4 2 5 6 2 3 2.10 ( 2.11 ) ( 2.11 ) ( 2.9 ) 7 8 9 3 10 5% 2% 4 11 93% (2001 02 2003 04 ) ( ) 2,490 (100%) 5 12 25% (2.57% 25%) 6 (2001 02 2003 04 ) 13 100%

More information

39898.indb

39898.indb 1988 4 1998 12 1990 5 40 70.................................................. 40.............................................................. 70..............................................................

More information

USB解决方案.ppt

USB解决方案.ppt USB USB? RS232 USB USB HID U modem ADSL cable modem IrDA Silabs USB CP210x USB UART USB RS-232 USB MCU 15 USB 12 FLASH MCU 3 USB MCU USB MCU C8051F32x 10 ADC 1.5%, Vref CPU 25MIPS 8051 16KB Flash -AMUX

More information

1-1 SH79F6431 A. 2( ) 9~15V ( 12V) U2 U3 3.3V SH79F B. 1(VCC/GND) SH79F6431 C. VDDIO SH79F6431 P4 P5 P0.6 P0.7 VDDIO VDDIO=5V D. 2 V 1.0

1-1 SH79F6431 A. 2( ) 9~15V ( 12V) U2 U3 3.3V SH79F B. 1(VCC/GND) SH79F6431 C. VDDIO SH79F6431 P4 P5 P0.6 P0.7 VDDIO VDDIO=5V D. 2 V 1.0 SH79F6431 1. SH79F6431 1T 8051 FLASH SH79F JET51 Keil µ vision JTAG 1.1. SH79F6431 LQFP64 1.2. (Target Board) SH79F6431 1 V 1.0 1-1 SH79F6431 A. 2( ) 9~15V ( 12V) U2 U3 3.3V SH79F6431 1 2 1 B. 1(VCC/GND)

More information

Kinetis SDK K64 Users Guide

Kinetis SDK K64 Users Guide Freescale Semiconductor, Inc. K64 MAPS 套 件 用 户 指 南 版 本 1.0.0, 12/2014 K64 MAPS 套 件 硬 件 用 户 指 南 目 录 1 引 言... 2 2 概 述... 2 2.1 硬 件 平 台... 2 2.2 MAPS-K64 简 介... 2 2.2.1 MAPS-K64 主 要 功 能 模 块... 3 2.2.2 MAPS-K64

More information

前 言 根 据 澳 门 特 别 行 政 区 第 11/1999 号 法 律 第 三 条 规 定, 审 计 长 执 行 其 职 责, 已 经 对 财 政 局 提 交 的 2011 年 度 澳 门 特 别 行 政 区 总 帐 目 ( 总 帐 目 ) 进 行 了 审 计 与 2010 年 度 相 同, 本 年 度 的 总 帐 目 由 政 府 一 般 综 合 帐 目 及 特 定 机 构 汇 总 帐 目, 两

More information

一、

一、 ... 1...24...58 - 2 - - 3 - - 4 - - 5 - - 6 - - 7 - - 8 - i. ii. iii. iv. i. ii. iii. iv. v. vi. vii. viii. ix. x. - 9 - xi. - 10 - - 11 - -12- -13- -14- -15- C. @ -16- @ -17- -18- -19- -20- -21- -22-

More information

2015 2 104 109 110 112 113 113 113 114 1 (1) 9,654,346,443 6,388,650,779 4,183,429,633 1,183,342,128 (2) 47,710,000 41,600,000 16,600,000 13,200,000 (3), (1) 371,147,787 125,421,629 749,150,179 565,001,961

More information

-i-

-i- -i- -ii- -iii- -iv- -v- -vi- -vii- -viii- -ix- -x- -xi- -xii- 1-1 1-2 1-3 1-4 1-5 1-6 1-7 1-8 1-9 1-10 1-11 1-12 1-13 1-14 1-15 1-16 1-17 1-18 1-19 1-20 1-21 2-1 2-2 2-3 2-4 2-5 2-6 2-7 2-8 2-9 2-10 2-11

More information

Microsoft Word - 强迫性活动一览表.docx

Microsoft Word - 强迫性活动一览表.docx 1 1 - / 2 - / 3 - / 4 - / 5 - I. 1. / 2. / 3. 4. 5. 6. 7. 8. 9 10 11. 12. 2 13. 14. 15. 16. 17. 18. 19. 20 21. 22 23. 24. / / 25. 26. 27. 28. 29. 30. 31. II. 1. 2 3. 4 3 5. 6 7 8. 9 10 11 12 13 14. 15.

More information

【工程类】

【工程类】 茂 名 市 地 方 税 务 局 会 议 室 功 能 升 级 项 目 采 购 项 目 编 号 :GZGD-2015-008 公 开 招 标 文 件 广 州 广 大 工 程 项 目 管 理 有 限 公 司 编 制 发 布 日 期 : 二 0 一 六 年 一 月 捌 日 目 录 第 一 部 分 投 标 邀 请 函 -----------------------------------------------------------------------------------------------------------

More information

Microsoft Word - Panel Paper on T&D-Chinese _as at 6.2.2013__final_.doc

Microsoft Word - Panel Paper on T&D-Chinese _as at 6.2.2013__final_.doc 二 零 一 三 年 二 月 十 八 日 會 議 討 論 文 件 立 法 會 CB(4)395/12-13(03) 號 文 件 立 法 會 公 務 員 及 資 助 機 構 員 工 事 務 委 員 會 公 務 員 培 訓 及 發 展 概 況 目 的 本 文 件 介 紹 公 務 員 事 務 局 為 公 務 員 所 提 供 培 訓 和 發 展 的 最 新 概 況, 以 及 將 於 二 零 一 三 年 推 出

More information

NC MCP MPG

NC MCP MPG HNC-21M ...1 1.1... 1 1.1.1... 1 1.1.2... 2 1.2... 3 1.2.1... 3 1.2.2... 3 1.2.3 NC... 3 1.2.4 MCP... 4 1.2.5 MPG... 4 1.3... 5 1.4... 6 1.4.1... 7 1.4.2... 7...9 2.1... 9 2.2... 9 2.3... 9 2.4... 10 2.5...

More information

上海东软载波微电子有限公司 SMART

上海东软载波微电子有限公司 SMART 上海东软载波微电子有限公司 SMART www.essemi.com SMART 7P 0 HR7P/ES7P OTPMCU A/D I/O OTP ROM RAM ES7P7x ES7P7PSD SOP +input 0 ES7P7PSF SOP0 7+input 0 ES7P7PRF SSOP0 7+input 0 EEPROM MHz 0 ~.V ~.V MHz, KHz MHz 0 ~.V

More information

快 速 搜 索 关 键 词 PDF 电 子 文 档 可 以 使 用 查 找 功 能 搜 索 关 键 词 例 如 在 Adobe Reader 中,Windows 用 户 使 用 快 捷 键 Ctrl+F,Mac 用 户 使 用 Command+F 即 可 搜 索 关 键 词 点 击 目 录 转 跳

快 速 搜 索 关 键 词 PDF 电 子 文 档 可 以 使 用 查 找 功 能 搜 索 关 键 词 例 如 在 Adobe Reader 中,Windows 用 户 使 用 快 捷 键 Ctrl+F,Mac 用 户 使 用 Command+F 即 可 搜 索 关 键 词 点 击 目 录 转 跳 MATRICE 600 用 户 手 册 V1.0 2016.04 快 速 搜 索 关 键 词 PDF 电 子 文 档 可 以 使 用 查 找 功 能 搜 索 关 键 词 例 如 在 Adobe Reader 中,Windows 用 户 使 用 快 捷 键 Ctrl+F,Mac 用 户 使 用 Command+F 即 可 搜 索 关 键 词 点 击 目 录 转 跳 用 户 可 以 通 过 目 录 了

More information

供热 2 版.indd

供热 2 版.indd 公 司 简 介 和 利 时 公 司 是 工 业 自 动 化 产 品 的 专 业 生 产 基 地 销 售 中 心 和 工 程 服 务 中 心, 致 力 于 工 业 自 动 化 领 域 发 展 已 近 20 年, 一 直 保 持 快 速 稳 健 的 发 展, 产 品 广 泛 应 用 在 电 力 化 工 石 化 市 政 建 材 冶 金 造 纸 制 药 环 保 城 市 轨 道 交 通 机 械 制 造 等 行

More information

2015年廉政公署民意調查

2015年廉政公署民意調查 報 告 摘 要 2015 年 廉 政 公 署 周 年 民 意 調 查 背 景 1.1 為 了 掌 握 香 港 市 民 對 貪 污 問 題 和 廉 政 公 署 工 作 的 看 法, 廉 政 公 署 在 1992 至 2009 年 期 間, 每 年 均 透 過 電 話 訪 問 進 行 公 眾 民 意 調 查 為 更 深 入 了 解 公 眾 對 貪 污 問 題 的 看 法 及 關 注, 以 制 訂 適 切

More information

forlinx

forlinx WON1101 武汉华和机电技术有限公司 注意事项与维护 产品使用环境 供电电压 : DC5V ± 10% 湿度 : 10 90%( 不结露 ) 注意事项 请勿带电插拔核心板及外围模块! 请遵循所有标注在产品上的警示和指引信息 请保持本产品干燥 如果不慎被任何液体泼溅或浸润, 请立刻断电并充分晾干 使用中注意本产品的通风散热, 避免温度过高造成元器件损坏 请勿在多尘 脏乱的环境中使用或存放本产品 请勿将本产品应用在冷热交替环境中,

More information

绝妙故事

绝妙故事 980.00 III... 1... 1... 4... 5... 8...10...11...12...14...16...18...20...23...23...24...25...27...29...29...31...34...35...36...39...41 IV...43...44...46...47...48...49...50...51...52...54...56...57...59...60...61...62...63...66...67...68...69...70...72...74...76...77...79...80

More information

尿路感染防治.doc

尿路感染防治.doc ...1...1...2...4...6...7...7...10...12...13...15...16...18...19...24...25...26...27...28 I II...29...30...31...32...33...34...36...37...37...38...40...40...41...43...44...46...47...48...48...49...52 III...55...56...56...57...58

More information

榫 卯 是 什 麼? 何 時 開 始 應 用 於 建 築 中? 38 中 國 傳 統 建 築 的 屋 頂 有 哪 幾 種 形 式? 40 大 內 高 手 的 大 內 指 什 麼? 42 街 坊 四 鄰 的 坊 和 街 分 別 指 什 麼? 44 北 京 四 合 院 的 典 型 格 局 是 怎 樣 的

榫 卯 是 什 麼? 何 時 開 始 應 用 於 建 築 中? 38 中 國 傳 統 建 築 的 屋 頂 有 哪 幾 種 形 式? 40 大 內 高 手 的 大 內 指 什 麼? 42 街 坊 四 鄰 的 坊 和 街 分 別 指 什 麼? 44 北 京 四 合 院 的 典 型 格 局 是 怎 樣 的 目 錄 中 華 醫 藥 以 醫 術 救 人 為 何 被 稱 為 懸 壺 濟 世? 2 什 麼 樣 的 醫 生 才 能 被 稱 為 華 佗 再 世? 4 中 醫 如 何 從 臉 色 看 人 的 特 質? 6 中 醫 怎 樣 從 五 官 看 病? 8 中 醫 看 舌 頭 能 看 出 些 什 麼 來? 10 中 醫 真 的 能 靠 一 個 枕 頭, 三 根 指 頭 診 病 嗎? 12 切 脈 能 判 斷

More information

心理障碍防治(下).doc

心理障碍防治(下).doc ( 20 010010) 787 1092 1/32 498.50 4 980 2004 9 1 2004 9 1 1 1 000 ISBN 7-204-05940-9/R 019 1880.00 ( 20.00 ) ...1...2...2...3...4...5...6...7...8...9...10... 11...12...13...15...16...17...19...21 I ...23...24...26...27...28...30...32...34...37...39...40...42...42...44...47...50...52...56...58...60...64...68

More information

1. 精 通 运 用 结 构 相 关 设 计 软 件, 如 Pro-E AutoCAD 等 ; 1. 参 不 机 器 人 项 目 评 估, 提 出 吅 理 的 产 品 结 构 设 计 方 案 ; 结 构 3 不 限 不 限 2. 3 年 以 上 工 业 产 品 结 构 设 计 工 作 经 验, 具

1. 精 通 运 用 结 构 相 关 设 计 软 件, 如 Pro-E AutoCAD 等 ; 1. 参 不 机 器 人 项 目 评 估, 提 出 吅 理 的 产 品 结 构 设 计 方 案 ; 结 构 3 不 限 不 限 2. 3 年 以 上 工 业 产 品 结 构 设 计 工 作 经 验, 具 子 公 司 名 称 新 兴 智 能 深 圳 万 腾 ( 深 圳 ) 职 位 人 数 机 械 运 控 调 试 员 哈 工 大 机 器 人 集 团 有 限 公 司 2016 届 校 园 招 聘 简 章 学 历 专 业 要 求 岗 位 职 责 自 动 化 机 械 制 造 专 业 机 械 及 自 动 化 专 业 1 精 通 CAD Pro/E 等 软 件, 熟 悉 从 组 立 图 到 零 件 图 的 设 计

More information

2. 我 沒 有 說 實 話, 因 為 我 的 鞋 子 其 實 是 [ 黑 色 / 藍 色 / 其 他 顏 色.]. 如 果 我 說 我 現 在 是 坐 著 的, 我 說 的 是 實 話 嗎? [ 我 說 的 對 還 是 不 對 ]? [ 等 對 方 回 答 ] 3. 這 是 [ 實 話 / 對 的

2. 我 沒 有 說 實 話, 因 為 我 的 鞋 子 其 實 是 [ 黑 色 / 藍 色 / 其 他 顏 色.]. 如 果 我 說 我 現 在 是 坐 著 的, 我 說 的 是 實 話 嗎? [ 我 說 的 對 還 是 不 對 ]? [ 等 對 方 回 答 ] 3. 這 是 [ 實 話 / 對 的 附 錄 美 國 國 家 兒 童 健 康 與 人 類 發 展 中 心 (NICHD) 偵 訊 指 導 手 冊 I. 開 場 白 1. 你 好, 我 的 名 字 是, 我 是 警 察 [ 介 紹 房 間 內 的 其 他 人, 不 過, 在 理 想 狀 態 下, 房 間 裡 不 該 有 其 他 人 ] 今 天 是 ( 年 月 日 ), 現 在 是 ( 幾 點 幾 分 ) 我 是 在 ( 地 點 ) 問 你

More information

bingdian001.com

bingdian001.com (AVA PROPRE 6HD) ... 5 1.1 1.2 1.3 1.4 1.5 1.6... 5... 6... 6... 9... 9... 10... 12 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9... 12... 12... 13... 13... 14... 15... 16... 17... 18 2.10... 18 2.11... 19 2.12...

More information

EC(2013-1 4)13 第 2 頁 (b) 把 總 目 100 在 2013-14 年 度 常 額 編 制 內 所 有 非 首 長 級 職 位 按 薪 級 中 點 估 計 的 年 薪 總 值 上 限 提 高 12,480,540 元, 即 由 461,070,000 元 增 至 473,550

EC(2013-1 4)13 第 2 頁 (b) 把 總 目 100 在 2013-14 年 度 常 額 編 制 內 所 有 非 首 長 級 職 位 按 薪 級 中 點 估 計 的 年 薪 總 值 上 限 提 高 12,480,540 元, 即 由 461,070,000 元 增 至 473,550 EC(2013-1 4)13 財 務 委 員 會 人 事 編 制 小 組 委 員 會 討 論 文 件 2014 年 1 月 8 日 總 目 100- 海 事 處 分 目 000 運 作 開 支 總 目 92- 律 政 司 分 目 000 運 作 開 支 總 目 158- 政 府 總 部 : 運 輸 及 房 屋 局 ( 運 輸 科 ) 分 目 000 運 作 開 支 請 各 委 員 向 財 務 委 員

More information

Microsoft Word - Paper on PA (Chi)_2016.01.19.docx

Microsoft Word - Paper on PA (Chi)_2016.01.19.docx 立 法 會 發 展 事 務 委 員 會 二 零 一 六 年 施 政 報 告 及 施 政 綱 領 有 關 發 展 局 的 措 施 引 言 行 政 長 官 在 二 零 一 六 年 一 月 十 三 日 發 表 題 為 創 新 經 濟 改 善 民 生 促 進 和 諧 繁 榮 共 享 的 二 零 一 六 年 施 政 報 告 施 政 報 告 夾 附 施 政 綱 領, 臚 列 政 府 推 行 的 新 措 施 和

More information

Arduino 1-1 Arduino 1-2 Arduino 1-3 Arduino IDE

Arduino 1-1 Arduino 1-2 Arduino 1-3 Arduino IDE Arduino 1-1 Arduino 1-2 Arduino 1-3 Arduino IDE Arduino 01 02 03 04 05 06 07 08 1-1 Arduino 2005 Massimo Banzi David Cuartielles David Mellis Arduino Arduino Arduino CC Arduino Arduino Arduino Arduino

More information

穨_2_.PDF

穨_2_.PDF 6 7.... 9.. 11.. 12... 14.. 15.... 3 .. 17 18.. 20... 25... 27... 29 30.. 4 31 32 34-35 36-38 39 40 5 6 : 1. 2. 1. 55 (2) 2. : 2.1 2.2 2.3 3. 4. ( ) 5. 6. ( ) 7. ( ) 8. ( ) 9. ( ) 10. 7 ( ) 1. 2. 3. 4.

More information

14A 0.1%5% 14A 14A.52 1 2 3 30 2

14A 0.1%5% 14A 14A.52 1 2 3 30 2 2389 30 1 14A 0.1%5% 14A 14A.52 1 2 3 30 2 (a) (b) (c) (d) (e) 3 (i) (ii) (iii) (iv) (v) (vi) (vii) 4 (1) (2) (3) (4) (5) 400,000 (a) 400,000300,000 100,000 5 (b) 30% (i)(ii) 200,000 400,000 400,000 30,000,000

More information

(Chi)_.indb

(Chi)_.indb 1,000,000 4,000,000 1,000,000 10,000,000 30,000,000 V-1 1,000,000 2,000,000 20,000,00010,000,0005,000,000 3,000,000 30 20% 35% 20%30% V-2 1) 2)3) 171 10,000,00050% 35% 171 V-3 30 V-4 50,000100,000 1) 2)

More information

Page i

Page i 况 1 1.1.1 1.1.2 1.1.3 2 2.1 2.1.1 2.1.2 2.1.3 2.1.4 Page i 2.2 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.3 2.3.1 Page ii 2.3.2 2.3.3 2.3.4 2.4 2.4.1 2.4.2 2.4.3 Page iii 2.5 2.5.1 2.6 2.6.1 2.6.2 3 3.1 3.1.1

More information

<4D6963726F736F667420576F7264202D203938BEC7A67EABD7B942B0CAC15AC075B3E6BF57A9DBA5CDC2B2B3B92DA5BFBD542E646F63>

<4D6963726F736F667420576F7264202D203938BEC7A67EABD7B942B0CAC15AC075B3E6BF57A9DBA5CDC2B2B3B92DA5BFBD542E646F63> 98 年 3 月 11 日 依 本 校 98 學 年 度 招 生 委 員 會 第 1 次 會 議 核 定 大 同 技 術 學 院 98 學 年 度 重 點 運 動 項 目 績 優 學 生 單 獨 招 生 簡 章 大 同 技 術 學 院 招 生 委 員 會 編 印 校 址 :600 嘉 義 市 彌 陀 路 253 號 電 話 :(05)2223124 轉 203 教 務 處 招 生 專 線 :(05)2223124

More information

Hz 10MHz 0.5V 5V 0.01% 10s 2 0.5V 5V 1Hz 1kHz 10% 90% 1% 3 1Hz 1MHz 1% EPM7128SLC84-15 LM361 LM361 Zlg

Hz 10MHz 0.5V 5V 0.01% 10s 2 0.5V 5V 1Hz 1kHz 10% 90% 1% 3 1Hz 1MHz 1% EPM7128SLC84-15 LM361 LM361 Zlg 1 1 a. 0.5V 5V 1Hz 1MHz b. 0.1% 2 : a. 0.5V 5V 1Hz 1MHz b. 0.1% (3) a. 0.5V 5V 100 s b. 1% 4 1 10 5 1MHz 6 1 2 1 0.1Hz 10MHz 0.5V 5V 0.01% 10s 2 0.5V 5V 1Hz 1kHz 10% 90% 1% 3 1Hz 1MHz 1% EPM7128SLC84-15

More information

P1500

P1500 深 圳 华 禹 工 控 科 技 有 限 公 司 P1500 用 户 使 用 手 册 深 圳 华 禹 工 控 科 技 有 限 公 司 编 制 联 系 电 话 邮 件 地 址 更 新 日 期 邝 足 林 15986765262 2850906986@qq.com 2014-11-04 文 件 编 号 20141104-001 版 本 号 / 修 订 号 V1.1 本 文 件 版 权 属 于 本 公 司

More information

世界名画及画家介绍(四).doc

世界名画及画家介绍(四).doc II...1...2...2...3...4...5...7...7...8...9...9...10... 11...12...13...14...15...15...16...18...18...19...20 III...21...21...22...24...24...25...26...27...28...29...30...30...31...33...33...34...35...36...36...37...38...39...40...41...42...43

More information

Microsoft Word - 00封面

Microsoft Word - 00封面 核 准 文 號 : 教 育 部 104 年 3 月 27 日 臺 教 國 署 高 字 第 1040034407 號 函 核 定 國 立 嘉 義 高 級 工 業 職 業 學 校 群 科 課 程 綱 要 總 體 課 程 計 畫 書 (104 學 年 度 入 學 學 生 適 用 ) 中 華 民 國 103 年 3 月 27 日 國 立 嘉 義 高 級 工 業 職 業 學 校 群 科 課 程 綱 要 總

More information

《计算机应用基础》学习材料(讲义)

《计算机应用基础》学习材料(讲义) 计 算 机 应 用 基 础 学 习 材 料 ( 讲 义 ) Fundamentals of Computer Application 2014-3-22 JIANGSU OPEN UNIVERSITY 第 二 学 习 周 计 算 机 基 础 知 识 ( 一 ) 导 学 在 本 学 习 周, 我 们 主 要 的 任 务 是 认 识 计 算 机 你 将 知 道 计 算 机 是 什 么 时 候 产 生 的,

More information

课外创新研学项目 构想、设计与实现

课外创新研学项目                   构想、设计与实现 实 验 教 学 改 革 与 学 科 竞 赛 相 互 促 进 东 南 大 学 电 工 电 子 实 验 中 心 胡 仁 杰 hurenjie@seu.edu.cn 主 要 内 容 全 国 大 学 生 电 子 设 计 竞 赛 发 展 概 况 竞 赛 设 计 概 要 创 新 实 验 教 学 实 践 环 境 建 设 全 国 大 学 生 电 子 设 计 竞 赛 宗 旨 结 合 教 学, 着 重 基 础 注 重

More information

ESP-WROOM-32 Espressif Systems

ESP-WROOM-32 Espressif Systems ESP-WROOM-32 Espressif Systems 206 2 9 ESP-WROOM-32 ESP-WROOM-32 2 3 4 ESP-WROOM-32 5 ESP-WROOM-32 206.08 V.0 206. V. 5 206. V.2 206.2 V.3 2. URL Wi-Fi Wi-Fi Bluetooth SIG 206 2 3 2. 3 2.2 4 2.3 Strapping

More information

PROTEUS VSM

PROTEUS  VSM Proteus VSM-- 1/1 PROTEUS VSM Proteus VSM ISIS Prospice VSM Proteus PROSPICE ARM7 PIC AVR HC11 8051 CPU LCD RS232 LED IAR Keil Hitech C make 6000 SPICE SPICE DLL SPICE3F5 14 FM PROTEUS PCB LED/LCD / 300

More information

图 片 展 示 : 资 源 简 介 : FPGA Altera CycloneII EP2C5T144C8 (4608 个 LE) 2 路 有 源 晶 振 (50M,25M) AS & JTAG 标 准 接 口 VGA 接 口 UART 接 口 蜂 鸣 器 8bit 并 行 DAC 8 路 按 键

图 片 展 示 : 资 源 简 介 : FPGA Altera CycloneII EP2C5T144C8 (4608 个 LE) 2 路 有 源 晶 振 (50M,25M) AS & JTAG 标 准 接 口 VGA 接 口 UART 接 口 蜂 鸣 器 8bit 并 行 DAC 8 路 按 键 官 方 淘 宝 地 址 :http://metech.taobao.com/ MeTech verilog 典 型 例 程 讲 解 V1.0 笔 者 :MeTech 小 芯 技 术 支 持 QQ : 417765928 1026690567 技 术 支 持 QQ 群 :207186911 China AET 讨 论 组 http://group.chinaaet.com/293 笔 者 博 客 :http://blog.csdn.net/ywhfdl

More information

1... 4 2... 5 2.1... 5 2.2... 5 2.3... 6 2.4... 6 2.5... 7 2.6... 7 3 2005... 8 3.1... 8 3.2... 9 3.3... 9 3.4 ( RMB100,000)... 9 3.5... 9 4...11 4.1.

1... 4 2... 5 2.1... 5 2.2... 5 2.3... 6 2.4... 6 2.5... 7 2.6... 7 3 2005... 8 3.1... 8 3.2... 9 3.3... 9 3.4 ( RMB100,000)... 9 3.5... 9 4...11 4.1. http://www.unsp.com.cn 1... 4 2... 5 2.1... 5 2.2... 5 2.3... 6 2.4... 6 2.5... 7 2.6... 7 3 2005... 8 3.1... 8 3.2... 9 3.3... 9 3.4 ( RMB100,000)... 9 3.5... 9 4...11 4.1... 11 4.2... 12 5... 13 5.1...

More information

中文手册

中文手册 PCC-3428 PC/104 1. PCC-3428 1.1 PCC-3428 90mm 96mm ST CPU STPC Atlas Atlas CPU 486 DX/DX2 CPU DX2 133MHz Atlas 2D LCD/CRT 100MHz SDRAM 64MBytes PCC-3428 10/100Mbps DOC EIDE USB PC/104 ST STPC Atlas STPC

More information

S6410T使用手册

S6410T使用手册 EASE4418 核心板硬件手册 版本 1.0 copyright@2016-2019 1 / 17 版权声明 本手册版权归属广州亿三电子科技有限公司所有, 并保留一切权力 未经广 州亿三电子科技有限公司许可 ( 书面形式 ), 任何单位和个人不得摘录本手册部 分或全部内容 违者将追究其法律责任! 广州亿三电子科技有限公司 日期 :2019-02-15 2 / 17 修订历史 : 版本号 说明 作者

More information

pdf

pdf SMART INVERTER, SMART CHOICE www.siemens.com.cn/v20 0.12 kw ~ 15 kw USS MODBUS RTU 7.5 kw ~ 15 kw PCB V/fV 2 /f 0.12 kw ~ 15 kw 1AC 200 V... 240 V ( -10 % / +10 % ) 3AC 380 V... 480 V ( -15 % / +10 % )

More information

樹 木 管 理 專 責 小 組 報 告 人 樹 共 融 綠 滿 家 園

樹 木 管 理 專 責 小 組 報 告 人 樹 共 融 綠 滿 家 園 樹 木 管 理 專 責 小 組 報 告 人 樹 共 融 綠 滿 家 園 序 言 我 們 都 愛 樹, 愛 那 鬱 鬱 葱 葱 的 綠 意, 愛 那 股 清 新 的 氣 息, 更 愛 那 溽 暑 中 遍 地 搖 曳 的 斑 斕 樹 蔭 人 與 樹 本 應 是 那 麼 近, 但 去 年 8 月 赤 柱 塌 樹 意 外, 卻 令 我 們 赫 然 發 現, 樹 木 原 來 也 可 以 潛 藏 著 危 險,

More information

Teaching kit_A4_part4.indd

Teaching kit_A4_part4.indd 4 ( 學 生 ) i. 認 識 專 題 研 習 甚 麽 是 專 題 研 習? 專 題 研 習 是 學 會 學 習 的 其 中 一 個 關 鍵 項 目 學 生 根 據 自 己 或 老 師 所 訂 立 的 主 題, 依 照 本 身 的 興 趣 和 能 力, 在 老 師 的 指 導 下, 擬 定 研 習 題 目, 設 定 探 討 的 策 略 和 方 法, 進 行 一 系 列 有 意 義 的 探 索 歷

More information

緒 言 董 事 會 宣 佈, 為 能 更 具 效 率 調 配 本 集 團 內 的 資 金 有 效 降 低 集 團 的 對 外 貸 款, 並 促 進 本 集 團 內 公 司 間 的 結 算 服 務, 於 2016 年 9 月 30 日, 本 公 司 中 糧 財 務 與 管 理 公 司 訂 立 財 務

緒 言 董 事 會 宣 佈, 為 能 更 具 效 率 調 配 本 集 團 內 的 資 金 有 效 降 低 集 團 的 對 外 貸 款, 並 促 進 本 集 團 內 公 司 間 的 結 算 服 務, 於 2016 年 9 月 30 日, 本 公 司 中 糧 財 務 與 管 理 公 司 訂 立 財 務 香 港 交 易 及 結 算 所 有 限 公 司 及 香 港 聯 合 交 易 所 有 限 公 司 對 本 公 告 的 內 容 概 不 負 責, 對 其 準 確 性 或 完 整 性 亦 不 發 表 任 何 聲 明, 並 明 確 表 示, 概 不 對 因 本 公 告 全 部 或 任 何 部 分 內 容 而 產 生 或 因 倚 賴 該 等 內 容 而 引 致 的 任 何 損 失 承 擔 任 何 責 任 JOY

More information

01repc_gb.doc

01repc_gb.doc I....1 II. III. IV....1...3...5 V.... 12 VI. VII. VIII. IX.... 14... 18... 21... 21 1... 22 2... 23 3... 25 4 (D3 ).. 26 5 ( )... 27 01repc_gb.doc - 1 - (1) ( ) - 2 - - 3 - http://www.csb.gov.hk/hkgcsb/psc

More information