Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: NECnfc SpiOLED USBHost mbed
Revision 0:9f11e7a30865, committed 2016-05-19
- Comitter:
- okini3939
- Date:
- Thu May 19 09:03:44 2016 +0000
- Child:
- 1:d83f8332ebfe
- Commit message:
- 1st build;
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/NECnfc.lib Thu May 19 09:03:44 2016 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/okini3939/code/NECnfc/#9c963cb53ef7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Naza.h Thu May 19 09:03:44 2016 +0000
@@ -0,0 +1,32 @@
+
+struct Naza_Gps {
+ uint32_t datetime;
+ int32_t longitude;
+ int32_t latitude;
+ int32_t altitude;
+ int32_t horizontal_accuracy;
+ int32_t vertical_accuracy;
+ int32_t dummy1;
+ int32_t north_velocity;
+ int32_t east_velocity;
+ int32_t down_velocity;
+ int16_t position_dop;
+ int16_t vertical_dop;
+ int16_t northing_dop;
+ int16_t easting_dop;
+ uint8_t satellites;
+ uint8_t dummy2;
+ uint8_t fix_type;
+ uint8_t dummy3;
+ uint8_t flags;
+ uint16_t dummy4;
+ uint8_t mask;
+ uint16_t sequence;
+} __attribute__((packed));
+
+struct Naza_Compass {
+ int16_t x;
+ int16_t y;
+ int16_t z;
+} __attribute__((packed));
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/PowerControl/EthernetPowerControl.cpp Thu May 19 09:03:44 2016 +0000
@@ -0,0 +1,138 @@
+#include "EthernetPowerControl.h"
+
+static void write_PHY (unsigned int PhyReg, unsigned short Value) {
+ /* Write a data 'Value' to PHY register 'PhyReg'. */
+ unsigned int tout;
+ /* Hardware MII Management for LPC176x devices. */
+ LPC_EMAC->MADR = DP83848C_DEF_ADR | PhyReg;
+ LPC_EMAC->MWTD = Value;
+
+ /* Wait utill operation completed */
+ for (tout = 0; tout < MII_WR_TOUT; tout++) {
+ if ((LPC_EMAC->MIND & MIND_BUSY) == 0) {
+ break;
+ }
+ }
+}
+
+static unsigned short read_PHY (unsigned int PhyReg) {
+ /* Read a PHY register 'PhyReg'. */
+ unsigned int tout, val;
+
+ LPC_EMAC->MADR = DP83848C_DEF_ADR | PhyReg;
+ LPC_EMAC->MCMD = MCMD_READ;
+
+ /* Wait until operation completed */
+ for (tout = 0; tout < MII_RD_TOUT; tout++) {
+ if ((LPC_EMAC->MIND & MIND_BUSY) == 0) {
+ break;
+ }
+ }
+ LPC_EMAC->MCMD = 0;
+ val = LPC_EMAC->MRDD;
+
+ return (val);
+}
+
+void EMAC_Init()
+{
+ unsigned int tout,regv;
+ /* Power Up the EMAC controller. */
+ Peripheral_PowerUp(LPC1768_PCONP_PCENET);
+
+ LPC_PINCON->PINSEL2 = 0x50150105;
+ LPC_PINCON->PINSEL3 &= ~0x0000000F;
+ LPC_PINCON->PINSEL3 |= 0x00000005;
+
+ /* Reset all EMAC internal modules. */
+ LPC_EMAC->MAC1 = MAC1_RES_TX | MAC1_RES_MCS_TX | MAC1_RES_RX | MAC1_RES_MCS_RX |
+ MAC1_SIM_RES | MAC1_SOFT_RES;
+ LPC_EMAC->Command = CR_REG_RES | CR_TX_RES | CR_RX_RES;
+
+ /* A short delay after reset. */
+ for (tout = 100; tout; tout--);
+
+ /* Initialize MAC control registers. */
+ LPC_EMAC->MAC1 = MAC1_PASS_ALL;
+ LPC_EMAC->MAC2 = MAC2_CRC_EN | MAC2_PAD_EN;
+ LPC_EMAC->MAXF = ETH_MAX_FLEN;
+ LPC_EMAC->CLRT = CLRT_DEF;
+ LPC_EMAC->IPGR = IPGR_DEF;
+
+ /* Enable Reduced MII interface. */
+ LPC_EMAC->Command = CR_RMII | CR_PASS_RUNT_FRM;
+
+ /* Reset Reduced MII Logic. */
+ LPC_EMAC->SUPP = SUPP_RES_RMII;
+ for (tout = 100; tout; tout--);
+ LPC_EMAC->SUPP = 0;
+
+ /* Put the DP83848C in reset mode */
+ write_PHY (PHY_REG_BMCR, 0x8000);
+
+ /* Wait for hardware reset to end. */
+ for (tout = 0; tout < 0x100000; tout++) {
+ regv = read_PHY (PHY_REG_BMCR);
+ if (!(regv & 0x8000)) {
+ /* Reset complete */
+ break;
+ }
+ }
+}
+
+
+void PHY_PowerDown()
+{
+ if (!Peripheral_GetStatus(LPC1768_PCONP_PCENET))
+ EMAC_Init(); //init EMAC if it is not already init'd
+
+ unsigned int regv;
+ regv = read_PHY(PHY_REG_BMCR);
+ write_PHY(PHY_REG_BMCR, regv | (1 << PHY_REG_BMCR_POWERDOWN));
+ regv = read_PHY(PHY_REG_BMCR);
+
+ //shouldn't need the EMAC now.
+ Peripheral_PowerDown(LPC1768_PCONP_PCENET);
+
+ //and turn off the PHY OSC
+ LPC_GPIO1->FIODIR |= 0x8000000;
+ LPC_GPIO1->FIOCLR = 0x8000000;
+}
+
+void PHY_PowerUp()
+{
+ if (!Peripheral_GetStatus(LPC1768_PCONP_PCENET))
+ EMAC_Init(); //init EMAC if it is not already init'd
+
+ LPC_GPIO1->FIODIR |= 0x8000000;
+ LPC_GPIO1->FIOSET = 0x8000000;
+
+ //wait for osc to be stable
+ wait_ms(200);
+
+ unsigned int regv;
+ regv = read_PHY(PHY_REG_BMCR);
+ write_PHY(PHY_REG_BMCR, regv & ~(1 << PHY_REG_BMCR_POWERDOWN));
+ regv = read_PHY(PHY_REG_BMCR);
+}
+
+void PHY_EnergyDetect_Enable()
+{
+ if (!Peripheral_GetStatus(LPC1768_PCONP_PCENET))
+ EMAC_Init(); //init EMAC if it is not already init'd
+
+ unsigned int regv;
+ regv = read_PHY(PHY_REG_EDCR);
+ write_PHY(PHY_REG_BMCR, regv | (1 << PHY_REG_EDCR_ENABLE));
+ regv = read_PHY(PHY_REG_EDCR);
+}
+
+void PHY_EnergyDetect_Disable()
+{
+ if (!Peripheral_GetStatus(LPC1768_PCONP_PCENET))
+ EMAC_Init(); //init EMAC if it is not already init'd
+ unsigned int regv;
+ regv = read_PHY(PHY_REG_EDCR);
+ write_PHY(PHY_REG_BMCR, regv & ~(1 << PHY_REG_EDCR_ENABLE));
+ regv = read_PHY(PHY_REG_EDCR);
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PowerControl/EthernetPowerControl.h Thu May 19 09:03:44 2016 +0000 @@ -0,0 +1,299 @@ +/* mbed PowerControl Library + * Copyright (c) 2010 Michael Wei + */ + +#ifndef MBED_POWERCONTROL_ETH_H +#define MBED_POWERCONTROL_ETH_H + +#include "mbed.h" +#include "PowerControl.h" + +#define PHY_REG_BMCR_POWERDOWN 0xB +#define PHY_REG_EDCR_ENABLE 0xF + + +void EMAC_Init(); +static unsigned short read_PHY (unsigned int PhyReg); +static void write_PHY (unsigned int PhyReg, unsigned short Value); + +void PHY_PowerDown(void); +void PHY_PowerUp(void); +void PHY_EnergyDetect_Enable(void); +void PHY_EnergyDetect_Disable(void); + +//From NXP Sample Code .... Probably from KEIL sample code +/* EMAC Memory Buffer configuration for 16K Ethernet RAM. */ +#define NUM_RX_FRAG 4 /* Num.of RX Fragments 4*1536= 6.0kB */ +#define NUM_TX_FRAG 3 /* Num.of TX Fragments 3*1536= 4.6kB */ +#define ETH_FRAG_SIZE 1536 /* Packet Fragment size 1536 Bytes */ + +#define ETH_MAX_FLEN 1536 /* Max. Ethernet Frame Size */ + +/* EMAC variables located in 16K Ethernet SRAM */ +#define RX_DESC_BASE 0x20080000 +#define RX_STAT_BASE (RX_DESC_BASE + NUM_RX_FRAG*8) +#define TX_DESC_BASE (RX_STAT_BASE + NUM_RX_FRAG*8) +#define TX_STAT_BASE (TX_DESC_BASE + NUM_TX_FRAG*8) +#define RX_BUF_BASE (TX_STAT_BASE + NUM_TX_FRAG*4) +#define TX_BUF_BASE (RX_BUF_BASE + NUM_RX_FRAG*ETH_FRAG_SIZE) + +/* RX and TX descriptor and status definitions. */ +#define RX_DESC_PACKET(i) (*(unsigned int *)(RX_DESC_BASE + 8*i)) +#define RX_DESC_CTRL(i) (*(unsigned int *)(RX_DESC_BASE+4 + 8*i)) +#define RX_STAT_INFO(i) (*(unsigned int *)(RX_STAT_BASE + 8*i)) +#define RX_STAT_HASHCRC(i) (*(unsigned int *)(RX_STAT_BASE+4 + 8*i)) +#define TX_DESC_PACKET(i) (*(unsigned int *)(TX_DESC_BASE + 8*i)) +#define TX_DESC_CTRL(i) (*(unsigned int *)(TX_DESC_BASE+4 + 8*i)) +#define TX_STAT_INFO(i) (*(unsigned int *)(TX_STAT_BASE + 4*i)) +#define RX_BUF(i) (RX_BUF_BASE + ETH_FRAG_SIZE*i) +#define TX_BUF(i) (TX_BUF_BASE + ETH_FRAG_SIZE*i) + +/* MAC Configuration Register 1 */ +#define MAC1_REC_EN 0x00000001 /* Receive Enable */ +#define MAC1_PASS_ALL 0x00000002 /* Pass All Receive Frames */ +#define MAC1_RX_FLOWC 0x00000004 /* RX Flow Control */ +#define MAC1_TX_FLOWC 0x00000008 /* TX Flow Control */ +#define MAC1_LOOPB 0x00000010 /* Loop Back Mode */ +#define MAC1_RES_TX 0x00000100 /* Reset TX Logic */ +#define MAC1_RES_MCS_TX 0x00000200 /* Reset MAC TX Control Sublayer */ +#define MAC1_RES_RX 0x00000400 /* Reset RX Logic */ +#define MAC1_RES_MCS_RX 0x00000800 /* Reset MAC RX Control Sublayer */ +#define MAC1_SIM_RES 0x00004000 /* Simulation Reset */ +#define MAC1_SOFT_RES 0x00008000 /* Soft Reset MAC */ + +/* MAC Configuration Register 2 */ +#define MAC2_FULL_DUP 0x00000001 /* Full Duplex Mode */ +#define MAC2_FRM_LEN_CHK 0x00000002 /* Frame Length Checking */ +#define MAC2_HUGE_FRM_EN 0x00000004 /* Huge Frame Enable */ +#define MAC2_DLY_CRC 0x00000008 /* Delayed CRC Mode */ +#define MAC2_CRC_EN 0x00000010 /* Append CRC to every Frame */ +#define MAC2_PAD_EN 0x00000020 /* Pad all Short Frames */ +#define MAC2_VLAN_PAD_EN 0x00000040 /* VLAN Pad Enable */ +#define MAC2_ADET_PAD_EN 0x00000080 /* Auto Detect Pad Enable */ +#define MAC2_PPREAM_ENF 0x00000100 /* Pure Preamble Enforcement */ +#define MAC2_LPREAM_ENF 0x00000200 /* Long Preamble Enforcement */ +#define MAC2_NO_BACKOFF 0x00001000 /* No Backoff Algorithm */ +#define MAC2_BACK_PRESSURE 0x00002000 /* Backoff Presurre / No Backoff */ +#define MAC2_EXCESS_DEF 0x00004000 /* Excess Defer */ + +/* Back-to-Back Inter-Packet-Gap Register */ +#define IPGT_FULL_DUP 0x00000015 /* Recommended value for Full Duplex */ +#define IPGT_HALF_DUP 0x00000012 /* Recommended value for Half Duplex */ + +/* Non Back-to-Back Inter-Packet-Gap Register */ +#define IPGR_DEF 0x00000012 /* Recommended value */ + +/* Collision Window/Retry Register */ +#define CLRT_DEF 0x0000370F /* Default value */ + +/* PHY Support Register */ +#define SUPP_SPEED 0x00000100 /* Reduced MII Logic Current Speed */ +#define SUPP_RES_RMII 0x00000800 /* Reset Reduced MII Logic */ + +/* Test Register */ +#define TEST_SHCUT_PQUANTA 0x00000001 /* Shortcut Pause Quanta */ +#define TEST_TST_PAUSE 0x00000002 /* Test Pause */ +#define TEST_TST_BACKP 0x00000004 /* Test Back Pressure */ + +/* MII Management Configuration Register */ +#define MCFG_SCAN_INC 0x00000001 /* Scan Increment PHY Address */ +#define MCFG_SUPP_PREAM 0x00000002 /* Suppress Preamble */ +#define MCFG_CLK_SEL 0x0000001C /* Clock Select Mask */ +#define MCFG_RES_MII 0x00008000 /* Reset MII Management Hardware */ + +/* MII Management Command Register */ +#define MCMD_READ 0x00000001 /* MII Read */ +#define MCMD_SCAN 0x00000002 /* MII Scan continuously */ + +#define MII_WR_TOUT 0x00050000 /* MII Write timeout count */ +#define MII_RD_TOUT 0x00050000 /* MII Read timeout count */ + +/* MII Management Address Register */ +#define MADR_REG_ADR 0x0000001F /* MII Register Address Mask */ +#define MADR_PHY_ADR 0x00001F00 /* PHY Address Mask */ + +/* MII Management Indicators Register */ +#define MIND_BUSY 0x00000001 /* MII is Busy */ +#define MIND_SCAN 0x00000002 /* MII Scanning in Progress */ +#define MIND_NOT_VAL 0x00000004 /* MII Read Data not valid */ +#define MIND_MII_LINK_FAIL 0x00000008 /* MII Link Failed */ + +/* Command Register */ +#define CR_RX_EN 0x00000001 /* Enable Receive */ +#define CR_TX_EN 0x00000002 /* Enable Transmit */ +#define CR_REG_RES 0x00000008 /* Reset Host Registers */ +#define CR_TX_RES 0x00000010 /* Reset Transmit Datapath */ +#define CR_RX_RES 0x00000020 /* Reset Receive Datapath */ +#define CR_PASS_RUNT_FRM 0x00000040 /* Pass Runt Frames */ +#define CR_PASS_RX_FILT 0x00000080 /* Pass RX Filter */ +#define CR_TX_FLOW_CTRL 0x00000100 /* TX Flow Control */ +#define CR_RMII 0x00000200 /* Reduced MII Interface */ +#define CR_FULL_DUP 0x00000400 /* Full Duplex */ + +/* Status Register */ +#define SR_RX_EN 0x00000001 /* Enable Receive */ +#define SR_TX_EN 0x00000002 /* Enable Transmit */ + +/* Transmit Status Vector 0 Register */ +#define TSV0_CRC_ERR 0x00000001 /* CRC error */ +#define TSV0_LEN_CHKERR 0x00000002 /* Length Check Error */ +#define TSV0_LEN_OUTRNG 0x00000004 /* Length Out of Range */ +#define TSV0_DONE 0x00000008 /* Tramsmission Completed */ +#define TSV0_MCAST 0x00000010 /* Multicast Destination */ +#define TSV0_BCAST 0x00000020 /* Broadcast Destination */ +#define TSV0_PKT_DEFER 0x00000040 /* Packet Deferred */ +#define TSV0_EXC_DEFER 0x00000080 /* Excessive Packet Deferral */ +#define TSV0_EXC_COLL 0x00000100 /* Excessive Collision */ +#define TSV0_LATE_COLL 0x00000200 /* Late Collision Occured */ +#define TSV0_GIANT 0x00000400 /* Giant Frame */ +#define TSV0_UNDERRUN 0x00000800 /* Buffer Underrun */ +#define TSV0_BYTES 0x0FFFF000 /* Total Bytes Transferred */ +#define TSV0_CTRL_FRAME 0x10000000 /* Control Frame */ +#define TSV0_PAUSE 0x20000000 /* Pause Frame */ +#define TSV0_BACK_PRESS 0x40000000 /* Backpressure Method Applied */ +#define TSV0_VLAN 0x80000000 /* VLAN Frame */ + +/* Transmit Status Vector 1 Register */ +#define TSV1_BYTE_CNT 0x0000FFFF /* Transmit Byte Count */ +#define TSV1_COLL_CNT 0x000F0000 /* Transmit Collision Count */ + +/* Receive Status Vector Register */ +#define RSV_BYTE_CNT 0x0000FFFF /* Receive Byte Count */ +#define RSV_PKT_IGNORED 0x00010000 /* Packet Previously Ignored */ +#define RSV_RXDV_SEEN 0x00020000 /* RXDV Event Previously Seen */ +#define RSV_CARR_SEEN 0x00040000 /* Carrier Event Previously Seen */ +#define RSV_REC_CODEV 0x00080000 /* Receive Code Violation */ +#define RSV_CRC_ERR 0x00100000 /* CRC Error */ +#define RSV_LEN_CHKERR 0x00200000 /* Length Check Error */ +#define RSV_LEN_OUTRNG 0x00400000 /* Length Out of Range */ +#define RSV_REC_OK 0x00800000 /* Frame Received OK */ +#define RSV_MCAST 0x01000000 /* Multicast Frame */ +#define RSV_BCAST 0x02000000 /* Broadcast Frame */ +#define RSV_DRIB_NIBB 0x04000000 /* Dribble Nibble */ +#define RSV_CTRL_FRAME 0x08000000 /* Control Frame */ +#define RSV_PAUSE 0x10000000 /* Pause Frame */ +#define RSV_UNSUPP_OPC 0x20000000 /* Unsupported Opcode */ +#define RSV_VLAN 0x40000000 /* VLAN Frame */ + +/* Flow Control Counter Register */ +#define FCC_MIRR_CNT 0x0000FFFF /* Mirror Counter */ +#define FCC_PAUSE_TIM 0xFFFF0000 /* Pause Timer */ + +/* Flow Control Status Register */ +#define FCS_MIRR_CNT 0x0000FFFF /* Mirror Counter Current */ + +/* Receive Filter Control Register */ +#define RFC_UCAST_EN 0x00000001 /* Accept Unicast Frames Enable */ +#define RFC_BCAST_EN 0x00000002 /* Accept Broadcast Frames Enable */ +#define RFC_MCAST_EN 0x00000004 /* Accept Multicast Frames Enable */ +#define RFC_UCAST_HASH_EN 0x00000008 /* Accept Unicast Hash Filter Frames */ +#define RFC_MCAST_HASH_EN 0x00000010 /* Accept Multicast Hash Filter Fram.*/ +#define RFC_PERFECT_EN 0x00000020 /* Accept Perfect Match Enable */ +#define RFC_MAGP_WOL_EN 0x00001000 /* Magic Packet Filter WoL Enable */ +#define RFC_PFILT_WOL_EN 0x00002000 /* Perfect Filter WoL Enable */ + +/* Receive Filter WoL Status/Clear Registers */ +#define WOL_UCAST 0x00000001 /* Unicast Frame caused WoL */ +#define WOL_BCAST 0x00000002 /* Broadcast Frame caused WoL */ +#define WOL_MCAST 0x00000004 /* Multicast Frame caused WoL */ +#define WOL_UCAST_HASH 0x00000008 /* Unicast Hash Filter Frame WoL */ +#define WOL_MCAST_HASH 0x00000010 /* Multicast Hash Filter Frame WoL */ +#define WOL_PERFECT 0x00000020 /* Perfect Filter WoL */ +#define WOL_RX_FILTER 0x00000080 /* RX Filter caused WoL */ +#define WOL_MAG_PACKET 0x00000100 /* Magic Packet Filter caused WoL */ + +/* Interrupt Status/Enable/Clear/Set Registers */ +#define INT_RX_OVERRUN 0x00000001 /* Overrun Error in RX Queue */ +#define INT_RX_ERR 0x00000002 /* Receive Error */ +#define INT_RX_FIN 0x00000004 /* RX Finished Process Descriptors */ +#define INT_RX_DONE 0x00000008 /* Receive Done */ +#define INT_TX_UNDERRUN 0x00000010 /* Transmit Underrun */ +#define INT_TX_ERR 0x00000020 /* Transmit Error */ +#define INT_TX_FIN 0x00000040 /* TX Finished Process Descriptors */ +#define INT_TX_DONE 0x00000080 /* Transmit Done */ +#define INT_SOFT_INT 0x00001000 /* Software Triggered Interrupt */ +#define INT_WAKEUP 0x00002000 /* Wakeup Event Interrupt */ + +/* Power Down Register */ +#define PD_POWER_DOWN 0x80000000 /* Power Down MAC */ + +/* RX Descriptor Control Word */ +#define RCTRL_SIZE 0x000007FF /* Buffer size mask */ +#define RCTRL_INT 0x80000000 /* Generate RxDone Interrupt */ + +/* RX Status Hash CRC Word */ +#define RHASH_SA 0x000001FF /* Hash CRC for Source Address */ +#define RHASH_DA 0x001FF000 /* Hash CRC for Destination Address */ + +/* RX Status Information Word */ +#define RINFO_SIZE 0x000007FF /* Data size in bytes */ +#define RINFO_CTRL_FRAME 0x00040000 /* Control Frame */ +#define RINFO_VLAN 0x00080000 /* VLAN Frame */ +#define RINFO_FAIL_FILT 0x00100000 /* RX Filter Failed */ +#define RINFO_MCAST 0x00200000 /* Multicast Frame */ +#define RINFO_BCAST 0x00400000 /* Broadcast Frame */ +#define RINFO_CRC_ERR 0x00800000 /* CRC Error in Frame */ +#define RINFO_SYM_ERR 0x01000000 /* Symbol Error from PHY */ +#define RINFO_LEN_ERR 0x02000000 /* Length Error */ +#define RINFO_RANGE_ERR 0x04000000 /* Range Error (exceeded max. size) */ +#define RINFO_ALIGN_ERR 0x08000000 /* Alignment Error */ +#define RINFO_OVERRUN 0x10000000 /* Receive overrun */ +#define RINFO_NO_DESCR 0x20000000 /* No new Descriptor available */ +#define RINFO_LAST_FLAG 0x40000000 /* Last Fragment in Frame */ +#define RINFO_ERR 0x80000000 /* Error Occured (OR of all errors) */ + +#define RINFO_ERR_MASK (RINFO_FAIL_FILT | RINFO_CRC_ERR | RINFO_SYM_ERR | \ + RINFO_LEN_ERR | RINFO_ALIGN_ERR | RINFO_OVERRUN) + +/* TX Descriptor Control Word */ +#define TCTRL_SIZE 0x000007FF /* Size of data buffer in bytes */ +#define TCTRL_OVERRIDE 0x04000000 /* Override Default MAC Registers */ +#define TCTRL_HUGE 0x08000000 /* Enable Huge Frame */ +#define TCTRL_PAD 0x10000000 /* Pad short Frames to 64 bytes */ +#define TCTRL_CRC 0x20000000 /* Append a hardware CRC to Frame */ +#define TCTRL_LAST 0x40000000 /* Last Descriptor for TX Frame */ +#define TCTRL_INT 0x80000000 /* Generate TxDone Interrupt */ + +/* TX Status Information Word */ +#define TINFO_COL_CNT 0x01E00000 /* Collision Count */ +#define TINFO_DEFER 0x02000000 /* Packet Deferred (not an error) */ +#define TINFO_EXCESS_DEF 0x04000000 /* Excessive Deferral */ +#define TINFO_EXCESS_COL 0x08000000 /* Excessive Collision */ +#define TINFO_LATE_COL 0x10000000 /* Late Collision Occured */ +#define TINFO_UNDERRUN 0x20000000 /* Transmit Underrun */ +#define TINFO_NO_DESCR 0x40000000 /* No new Descriptor available */ +#define TINFO_ERR 0x80000000 /* Error Occured (OR of all errors) */ + +/* DP83848C PHY Registers */ +#define PHY_REG_BMCR 0x00 /* Basic Mode Control Register */ +#define PHY_REG_BMSR 0x01 /* Basic Mode Status Register */ +#define PHY_REG_IDR1 0x02 /* PHY Identifier 1 */ +#define PHY_REG_IDR2 0x03 /* PHY Identifier 2 */ +#define PHY_REG_ANAR 0x04 /* Auto-Negotiation Advertisement */ +#define PHY_REG_ANLPAR 0x05 /* Auto-Neg. Link Partner Abitily */ +#define PHY_REG_ANER 0x06 /* Auto-Neg. Expansion Register */ +#define PHY_REG_ANNPTR 0x07 /* Auto-Neg. Next Page TX */ + +/* PHY Extended Registers */ +#define PHY_REG_STS 0x10 /* Status Register */ +#define PHY_REG_MICR 0x11 /* MII Interrupt Control Register */ +#define PHY_REG_MISR 0x12 /* MII Interrupt Status Register */ +#define PHY_REG_FCSCR 0x14 /* False Carrier Sense Counter */ +#define PHY_REG_RECR 0x15 /* Receive Error Counter */ +#define PHY_REG_PCSR 0x16 /* PCS Sublayer Config. and Status */ +#define PHY_REG_RBR 0x17 /* RMII and Bypass Register */ +#define PHY_REG_LEDCR 0x18 /* LED Direct Control Register */ +#define PHY_REG_PHYCR 0x19 /* PHY Control Register */ +#define PHY_REG_10BTSCR 0x1A /* 10Base-T Status/Control Register */ +#define PHY_REG_CDCTRL1 0x1B /* CD Test Control and BIST Extens. */ +#define PHY_REG_EDCR 0x1D /* Energy Detect Control Register */ + +#define PHY_FULLD_100M 0x2100 /* Full Duplex 100Mbit */ +#define PHY_HALFD_100M 0x2000 /* Half Duplex 100Mbit */ +#define PHY_FULLD_10M 0x0100 /* Full Duplex 10Mbit */ +#define PHY_HALFD_10M 0x0000 /* Half Duplex 10MBit */ +#define PHY_AUTO_NEG 0x3000 /* Select Auto Negotiation */ + +#define DP83848C_DEF_ADR 0x0100 /* Default PHY device address */ +#define DP83848C_ID 0x20005C90 /* PHY Identifier */ +#endif \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/PowerControl/PowerControl.h Thu May 19 09:03:44 2016 +0000
@@ -0,0 +1,192 @@
+/* mbed PowerControl Library
+ * Copyright (c) 2010 Michael Wei
+ */
+
+#ifndef MBED_POWERCONTROL_H
+#define MBED_POWERCONTROL_H
+
+//shouldn't have to include, but fixes weird problems with defines
+#include "mbed.h"
+
+//System Control Register
+// bit 0: Reserved
+// bit 1: Sleep on Exit
+#define LPC1768_SCR_SLEEPONEXIT 0x2
+// bit 2: Deep Sleep
+#define LPC1768_SCR_SLEEPDEEP 0x4
+// bit 3: Resereved
+// bit 4: Send on Pending
+#define LPC1768_SCR_SEVONPEND 0x10
+// bit 5-31: Reserved
+
+//Power Control Register
+// bit 0: Power mode control bit 0 (power-down mode)
+#define LPC1768_PCON_PM0 0x1
+// bit 1: Power mode control bit 1 (deep power-down mode)
+#define LPC1768_PCON_PM1 0x2
+// bit 2: Brown-out reduced power mode
+#define LPC1768_PCON_BODRPM 0x4
+// bit 3: Brown-out global disable
+#define LPC1768_PCON_BOGD 0x8
+// bit 4: Brown-out reset disable
+#define LPC1768_PCON_BORD 0x10
+// bit 5-7 : Reserved
+// bit 8: Sleep Mode Entry Flag
+#define LPC1768_PCON_SMFLAG 0x100
+// bit 9: Deep Sleep Entry Flag
+#define LPC1768_PCON_DSFLAG 0x200
+// bit 10: Power Down Entry Flag
+#define LPC1768_PCON_PDFLAG 0x400
+// bit 11: Deep Power Down Entry Flag
+#define LPC1768_PCON_DPDFLAG 0x800
+// bit 12-31: Reserved
+
+//"Sleep Mode" (WFI).
+inline void Sleep(void)
+{
+ __WFI();
+}
+
+//"Deep Sleep" Mode
+inline void DeepSleep(void)
+{
+ SCB->SCR |= LPC1768_SCR_SLEEPDEEP;
+ __WFI();
+}
+
+//"Power-Down" Mode
+inline void PowerDown(void)
+{
+ SCB->SCR |= LPC1768_SCR_SLEEPDEEP;
+ LPC_SC->PCON &= ~LPC1768_PCON_PM1;
+ LPC_SC->PCON |= LPC1768_PCON_PM0;
+ __WFI();
+ //reset back to normal
+ LPC_SC->PCON &= ~(LPC1768_PCON_PM1 | LPC1768_PCON_PM0);
+}
+
+//"Deep Power-Down" Mode
+inline void DeepPowerDown(void)
+{
+ SCB->SCR |= LPC1768_SCR_SLEEPDEEP;
+ LPC_SC->PCON |= LPC1768_PCON_PM1 | LPC1768_PCON_PM0;
+ __WFI();
+ //reset back to normal
+ LPC_SC->PCON &= ~(LPC1768_PCON_PM1 | LPC1768_PCON_PM0);
+}
+
+//shut down BOD during power-down/deep sleep
+inline void BrownOut_ReducedPowerMode_Enable(void)
+{
+ LPC_SC->PCON |= LPC1768_PCON_BODRPM;
+}
+
+//turn on BOD during power-down/deep sleep
+inline void BrownOut_ReducedPowerMode_Disable(void)
+{
+ LPC_SC->PCON &= ~LPC1768_PCON_BODRPM;
+}
+
+//turn off brown out circutry
+inline void BrownOut_Global_Disable(void)
+{
+ LPC_SC->PCON |= LPC1768_PCON_BOGD;
+}
+
+//turn on brown out circutry
+inline void BrownOut_Global_Enable(void)
+{
+ LPC_SC->PCON &= !LPC1768_PCON_BOGD;
+}
+
+//turn off brown out reset circutry
+inline void BrownOut_Reset_Disable(void)
+{
+ LPC_SC->PCON |= LPC1768_PCON_BORD;
+}
+
+//turn on brown outreset circutry
+inline void BrownOut_Reset_Enable(void)
+{
+ LPC_SC->PCON &= ~LPC1768_PCON_BORD;
+}
+//Peripheral Control Register
+// bit 0: Reserved
+// bit 1: PCTIM0: Timer/Counter 0 power/clock enable
+#define LPC1768_PCONP_PCTIM0 0x2
+// bit 2: PCTIM1: Timer/Counter 1 power/clock enable
+#define LPC1768_PCONP_PCTIM1 0x4
+// bit 3: PCUART0: UART 0 power/clock enable
+#define LPC1768_PCONP_PCUART0 0x8
+// bit 4: PCUART1: UART 1 power/clock enable
+#define LPC1768_PCONP_PCUART1 0x10
+// bit 5: Reserved
+// bit 6: PCPWM1: PWM 1 power/clock enable
+#define LPC1768_PCONP_PCPWM1 0x40
+// bit 7: PCI2C0: I2C interface 0 power/clock enable
+#define LPC1768_PCONP_PCI2C0 0x80
+// bit 8: PCSPI: SPI interface power/clock enable
+#define LPC1768_PCONP_PCSPI 0x100
+// bit 9: PCRTC: RTC power/clock enable
+#define LPC1768_PCONP_PCRTC 0x200
+// bit 10: PCSSP1: SSP interface 1 power/clock enable
+#define LPC1768_PCONP_PCSSP1 0x400
+// bit 11: Reserved
+// bit 12: PCADC: A/D converter power/clock enable
+#define LPC1768_PCONP_PCADC 0x1000
+// bit 13: PCCAN1: CAN controller 1 power/clock enable
+#define LPC1768_PCONP_PCCAN1 0x2000
+// bit 14: PCCAN2: CAN controller 2 power/clock enable
+#define LPC1768_PCONP_PCCAN2 0x4000
+// bit 15: PCGPIO: GPIOs power/clock enable
+#define LPC1768_PCONP_PCGPIO 0x8000
+// bit 16: PCRIT: Repetitive interrupt timer power/clock enable
+#define LPC1768_PCONP_PCRIT 0x10000
+// bit 17: PCMCPWM: Motor control PWM power/clock enable
+#define LPC1768_PCONP_PCMCPWM 0x20000
+// bit 18: PCQEI: Quadrature encoder interface power/clock enable
+#define LPC1768_PCONP_PCQEI 0x40000
+// bit 19: PCI2C1: I2C interface 1 power/clock enable
+#define LPC1768_PCONP_PCI2C1 0x80000
+// bit 20: Reserved
+// bit 21: PCSSP0: SSP interface 0 power/clock enable
+#define LPC1768_PCONP_PCSSP0 0x200000
+// bit 22: PCTIM2: Timer 2 power/clock enable
+#define LPC1768_PCONP_PCTIM2 0x400000
+// bit 23: PCTIM3: Timer 3 power/clock enable
+#define LPC1768_PCONP_PCQTIM3 0x800000
+// bit 24: PCUART2: UART 2 power/clock enable
+#define LPC1768_PCONP_PCUART2 0x1000000
+// bit 25: PCUART3: UART 3 power/clock enable
+#define LPC1768_PCONP_PCUART3 0x2000000
+// bit 26: PCI2C2: I2C interface 2 power/clock enable
+#define LPC1768_PCONP_PCI2C2 0x4000000
+// bit 27: PCI2S: I2S interface power/clock enable
+#define LPC1768_PCONP_PCI2S 0x8000000
+// bit 28: Reserved
+// bit 29: PCGPDMA: GP DMA function power/clock enable
+#define LPC1768_PCONP_PCGPDMA 0x20000000
+// bit 30: PCENET: Ethernet block power/clock enable
+#define LPC1768_PCONP_PCENET 0x40000000
+// bit 31: PCUSB: USB interface power/clock enable
+#define LPC1768_PCONP_PCUSB 0x80000000
+
+//Powers Up specified Peripheral(s)
+inline unsigned int Peripheral_PowerUp(unsigned int bitMask)
+{
+ return LPC_SC->PCONP |= bitMask;
+}
+
+//Powers Down specified Peripheral(s)
+inline unsigned int Peripheral_PowerDown(unsigned int bitMask)
+{
+ return LPC_SC->PCONP &= ~bitMask;
+}
+
+//returns if the peripheral is on or off
+inline bool Peripheral_GetStatus(unsigned int peripheral)
+{
+ return (LPC_SC->PCONP & peripheral) ? true : false;
+}
+
+#endif
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SpiOLED.lib Thu May 19 09:03:44 2016 +0000 @@ -0,0 +1,1 @@ +https://developer.mbed.org/users/okini3939/code/TextOLED/#c96e6ffd4c43
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBHost.lib Thu May 19 09:03:44 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/USBHost/#3f7f33efb18c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/drone.h Thu May 19 09:03:44 2016 +0000
@@ -0,0 +1,55 @@
+
+#define DATA_TYPE_AIR 1
+#define DATA_TYPE_GROUND 2
+
+struct AirData {
+ uint8_t magic[4];
+ int16_t seq;
+ int16_t type;
+ int16_t aileron; // Right stick/L-R
+ int16_t elevator; // Left stick/D-U
+ int16_t throttle; // Right stick/D-U
+ int16_t rudder; // Left stick/L-R
+ int16_t analog1;
+ int16_t analog2;
+ int16_t sw1;
+ int16_t sw2;
+ int16_t flags;
+ uint8_t sum;
+} __attribute__((packed));
+
+struct GroundData {
+ uint8_t magic[4];
+ int16_t seq;
+ int16_t type;
+ int16_t uptime;
+ int16_t battery;
+ int16_t current;
+ int32_t amphour;
+ int16_t distance1, distance2;
+ uint8_t gps[60];
+ uint8_t compass[10];
+ uint8_t sum;
+} __attribute__((packed));
+
+struct Status {
+ int gps_date, gps_time, gps_lat, gps_lng, gps_h;
+ int gps_sat, gps_type, gps_flg, gps_lost;
+ int compass_x, compass_y, compass_z, compass;
+ int uptime, battery, current, amphour;
+ int distance1, distance2;
+};
+
+void recvRf (struct GroundData *recv_data, int rssi);
+int sendRf (struct AirData *send_data);
+void pollRf ();
+int initRf ();
+
+void parseGps (uint8_t *buf);
+void parseCompass (uint8_t *buf);
+
+void initGps ();
+
+void log ();
+int initMsd ();
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/gps.cpp Thu May 19 09:03:44 2016 +0000
@@ -0,0 +1,120 @@
+#include "mbed.h"
+#include "drone.h"
+
+RawSerial gps(p28, p27);
+
+static char buf_gps[80];
+static int count_gps = 0;
+
+extern struct Status stat_gnd;
+
+float gpsminsec2degree (float ms) { // dddmm.mmmm -> deg
+ float deg;
+
+ deg = (int)ms / 100;
+ deg += (ms - (deg * 100)) / 60.0;
+ return deg;
+}
+
+int dmy2ymd (int d) {
+ if (! d) return 0;
+ return ((2000 + (d % 100)) * 10000) + (((d / 100) % 100) * 100) + ((d / 10000) % 100);
+}
+
+void parseGpsNmea () {
+ int i = 0;
+ float f;
+ char *buf = buf_gps;
+
+ if (strncmp(buf, "$GPRMC", 6) == 0) {
+ for (;;) {
+ buf = strstr(buf, ",");
+ if (buf == NULL) break;
+ buf ++;
+ f = atof(buf);
+ i ++;
+ switch (i) {
+ case 1:
+ stat_gnd.gps_time = f;
+ break;
+ case 9:
+ stat_gnd.gps_date = dmy2ymd(f);
+ break;
+ }
+ }
+ } else
+ if (strncmp(buf, "$GPGGA", 6) == 0) {
+ for (;;) {
+ buf = strstr(buf, ",");
+ if (buf == NULL) break;
+ buf ++;
+ f = atof(buf);
+ i ++;
+ switch (i) {
+ case 2:
+ stat_gnd.gps_lat = gpsminsec2degree(f) * 10000000;
+ break;
+ case 3:
+ if (buf[0] == 'S') stat_gnd.gps_lat = - stat_gnd.gps_lat;
+ break;
+ case 4:
+ stat_gnd.gps_lng = gpsminsec2degree(f) * 10000000;
+ break;
+ case 5:
+ if (buf[0] == 'W') stat_gnd.gps_lng = - stat_gnd.gps_lng;
+ break;
+ case 6:
+ if (buf[0] != '0') {
+ stat_gnd.gps_flg = 1;
+ } else {
+ stat_gnd.gps_lat = 0;
+ stat_gnd.gps_lng = 0;
+ }
+ break;
+ case 7:
+// gps_cnt = f;
+ break;
+ case 9:
+ stat_gnd.gps_h = f;
+ break;
+ }
+ }
+ } else
+ if (strncmp(buf, "$GPGSV", 6) == 0) {
+ for (;;) {
+ buf = strstr(buf, ",");
+ if (buf == NULL) break;
+ buf ++;
+ f = atof(buf);
+ i ++;
+ switch (i) {
+ case 3:
+ stat_gnd.gps_sat = f;
+ break;
+ }
+ }
+ } else
+ if (strncmp(buf, "$GPGLL", 6) == 0) {
+ }
+}
+
+void isrGps () {
+ char c;
+ c = gps.getc();
+ if (c == '\r' || c == '\n') {
+ buf_gps[count_gps] = 0;
+ if (count_gps) {
+ parseGpsNmea();
+ count_gps = 0;
+ }
+ } else
+ if (count_gps < sizeof(buf_gps) - 1) {
+ buf_gps[count_gps] = c;
+ count_gps ++;
+ }
+}
+
+void initGps () {
+ gps.baud(4800);
+ gps.attach(isrGps);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Thu May 19 09:03:44 2016 +0000
@@ -0,0 +1,319 @@
+#include "mbed.h"
+#include "drone.h"
+#include "SpiOLED.h"
+#include "EthernetPowerControl.h"
+
+#define STICK_CENTER 0x400
+#define STICK_TILT 0x294
+#define STICK_SWITCH 0x200
+#define STICK_CHATTER 30
+
+DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
+DigitalOut led5(p26), led6(p29), led7(p30);
+Serial pc(USBTX, USBRX);
+AnalogIn adc[6] = {p20, p19, p18, p17, p16, p15};
+DigitalIn sw[3] = {p23, p24, p25};
+DigitalOut sw_pwr1(p21), sw_pwr2(p22);
+SpiOLED oled(p5, p6, p7, p8, SpiOLED::LCD20x2);
+
+volatile int received = 0;
+struct AirData send_data;
+
+struct Status stat, stat_gnd;
+volatile int sw_fil = 0, sw_stat = 0, sw_cmd = 0, sw_xcmd = 0;
+int mode = 0;
+int rf_dual = 0;
+
+
+void recvRf (struct GroundData *recv_data, int rssi) {
+
+ if (recv_data->type != DATA_TYPE_GROUND) return;
+
+ parseGps(recv_data->gps);
+ parseCompass(recv_data->compass);
+ stat.uptime = recv_data->uptime;
+ stat.battery = recv_data->battery;
+ stat.current = recv_data->current;
+ stat.amphour = recv_data->amphour;
+ stat.distance1 = recv_data->distance1;
+ stat.distance2 = recv_data->distance2;
+
+ received = recv_data->seq;
+ led2 = !led2;
+
+ log();
+}
+
+int getAnalog (int n) {
+ int ad;
+
+ __disable_irq();
+ ad = (adc[n].read() - 0.5) * 2.0 * (STICK_TILT + STICK_CHATTER);
+ __enable_irq();
+ if (ad < - STICK_CHATTER) {
+ ad += STICK_CHATTER;
+ } else
+ if (ad > STICK_CHATTER) {
+ ad -= STICK_CHATTER;
+ } else {
+ ad = 0;
+ }
+
+ if (ad < - STICK_TILT) ad = - STICK_TILT;
+ if (ad > STICK_TILT) ad = STICK_TILT;
+
+ return STICK_CENTER + ad;
+}
+
+int getSwitch () {
+ int i, r = 0;
+
+ sw_pwr1 = 0;
+ sw_pwr2 = 1;
+ for (volatile int w = 0; w < 10; w ++);
+ for (i = 0; i < 3; i ++) {
+ if (!sw[i]) r |= (1<<(i * 2));
+ }
+ sw_pwr1 = 1;
+ sw_pwr2 = 0;
+ for (volatile int w = 0; w < 10; w ++);
+ for (i = 0; i < 3; i ++) {
+ if (!sw[i]) r |= (2<<(i * 2));
+ }
+ return r;
+}
+
+void input () {
+ int a, b, c;
+
+ a = getSwitch();
+ if (a == sw_fil) {
+ b = sw_stat;
+ sw_stat = a;
+ c = (b ^ a) & ~a;
+ b = (b ^ a) & a;
+ if (b) sw_cmd = b;
+ if (c) sw_xcmd = c;
+ }
+ sw_fil = a;
+
+ if (sw_stat & 0x01) {
+ // start (ignition)
+ send_data.aileron = STICK_CENTER + STICK_TILT;
+ send_data.elevator = STICK_CENTER + STICK_TILT;
+ send_data.throttle = STICK_CENTER + STICK_TILT;
+ send_data.rudder = STICK_CENTER + STICK_TILT;
+ led5 = 1;
+ } else {
+ // normal
+ send_data.aileron = getAnalog(0);
+ send_data.elevator = getAnalog(1);
+ send_data.throttle = getAnalog(2);
+ send_data.rudder = getAnalog(3);
+
+ if (send_data.aileron == STICK_CENTER && send_data.elevator == STICK_CENTER && send_data.rudder == STICK_CENTER) {
+ led6 = 1;
+ } else {
+ led6 = 0;
+ }
+ if (send_data.throttle == STICK_CENTER) {
+ led7 = 1;
+ } else {
+ led7 = 0;
+ }
+ }
+
+ send_data.analog1 = getAnalog(4);
+ send_data.analog2 = getAnalog(5);
+ send_data.sw1 = STICK_CENTER - (sw_stat & 0x04 ? STICK_SWITCH : 0) + (sw_stat & 0x08 ? STICK_SWITCH : 0);
+ send_data.sw2 = STICK_CENTER - (sw_stat & 0x10 ? STICK_SWITCH : 0) + (sw_stat & 0x20 ? STICK_SWITCH : 0);
+// printf(" A=%03x, E=%03x, T=%03x, R=%03x, X1=%03x, X2=%03x, sw=%02x\r\n", send_data.aileron, send_data.elevator, send_data.throttle, send_data.rudder, send_data.analog1, send_data.analog2, sw);
+}
+
+void display () {
+ if (sw_cmd & 0x02) {
+ mode ++;
+ sw_cmd = 0;
+ oled.cls();
+ }
+
+ switch (mode) {
+ case 0:
+ oled.locate(0, 0);
+ oled.printf("%4.1fV %4.1fA %4dmAh", (float)stat.battery / 1000.0, (float)stat.current / 1000.0, stat.amphour);
+ oled.locate(0, 1);
+ oled.printf("%4d %4d", stat.distance1, stat.distance2);
+ break;
+ case 1: // GPS
+ oled.locate(0, 0);
+ oled.printf("%8.5f %9.5f", (float)stat.gps_lat / 10000000.0, (float)stat.gps_lng / 10000000.0);
+ oled.locate(0, 1);
+ oled.printf("%4d %4d %4d %4d", stat.compass_x, stat.compass_y, stat.compass_z, stat.compass);
+ break;
+ case 2: // GPS
+ oled.locate(0, 0);
+ oled.printf("%4d %4d %4d %4d", stat.compass_x, stat.compass_y, stat.compass_z, stat.compass);
+ oled.locate(0, 1);
+ oled.printf("%4d %08d %06d", stat.gps_h, stat.gps_date, stat.gps_time);
+ break;
+ case 3: // GPS ground
+ oled.locate(0, 0);
+ oled.printf("%8.5f %9.5fG", (float)stat_gnd.gps_lat / 10000000.0, (float)stat_gnd.gps_lng / 10000000.0);
+ oled.locate(0, 1);
+ oled.printf("%4d %08d %06d", stat_gnd.gps_h, stat_gnd.gps_date, stat_gnd.gps_time);
+ break;
+ case 4: // stick
+ oled.locate(0, 0);
+ oled.printf("A%03x E%03x T%03x R%03x", send_data.aileron, send_data.elevator, send_data.throttle, send_data.rudder);
+ oled.locate(0, 1);
+ oled.printf(" %03x %03x %03x %03x", send_data.analog1, send_data.analog2, send_data.sw1, send_data.sw2);
+ break;
+ default:
+ mode = 0;
+ break;
+ }
+
+ oled.locate(19, 0);
+ oled.putc((received & 1) ? (rf_dual == 3 ? '*' : '.') : ' ');
+/*
+ pc.printf("Drone sec=%3d %4.1fV %4.1fA %4dmAh", stat.uptime, (float)stat.battery / 1000.0, (float)stat.current / 1000.0, stat.amphour / 1000);
+ pc.printf(" dis1=%4d dis2=%4d\r\n", stat.distance1, stat.distance2);
+ pc.printf(" lat=%8.5f lng=%9.5f", (float)stat.gps_lat / 10000000.0, (float)stat.gps_lng / 10000000.0);
+ pc.printf(" h=%d %08d %06d\r\n", stat.gps_h, stat.gps_date, stat.gps_time);
+ pc.printf(" x=%4d y=4d z=%4d deg=%4d", stat.compass_x, stat.compass_y, stat.compass_z, stat.compass);
+ pc.printf(" sat=%d type=%d flg=%d\r\n", stat.gps_sat, stat.gps_type, stat.gps_flg);
+*/
+}
+
+void center () {
+ int flg = 1;
+
+ for (;;) {
+ input();
+
+ if (send_data.aileron == STICK_CENTER && send_data.elevator == STICK_CENTER && send_data.rudder == STICK_CENTER &&
+ send_data.throttle == STICK_CENTER && send_data.analog1 == STICK_CENTER && send_data.analog2 == STICK_CENTER) {
+ break;
+ }
+
+ if (flg) {
+ flg = 0;
+ oled.cls();
+ oled.locate(6, 0);
+ oled.printf("STICKS ARE");
+ oled.locate(6, 1);
+ oled.printf("NOT IN CENTER!");
+ }
+
+ oled.locate(0, 0);
+ oled.printf("%4d", send_data.analog2 - STICK_CENTER);
+ oled.locate(0, 1);
+ oled.printf("%4d", send_data.analog1 - STICK_CENTER);
+ led5 = !led5;
+ wait_ms(200);
+ }
+ oled.cls();
+}
+
+void fault () {
+ for (;;) {
+ led5 = !led5;
+ wait_ms(200);
+ }
+}
+
+void adjust () {
+ int i;
+
+ if (stat_gnd.gps_date && stat_gnd.gps_time) {
+ struct tm t;
+ t.tm_year = ((stat_gnd.gps_date / 10000) % 10000) - 1900;
+ t.tm_mon = ((stat_gnd.gps_date / 100) % 100) - 1;
+ t.tm_mday = (stat_gnd.gps_date % 100);
+ t.tm_hour = (stat_gnd.gps_time / 10000) % 100;
+ t.tm_min = (stat_gnd.gps_time / 100) % 100;
+ t.tm_sec = stat_gnd.gps_time % 100;
+ time_t gpstime = mktime(&t) + (9 * 60 * 60);
+
+ time_t s = time(NULL);
+ i = s > gpstime ? s - gpstime : gpstime - s;
+ if (i > 1 && t.tm_sec >= 15 && t.tm_sec < 45 && t.tm_year >= 115 && t.tm_year < 138) {
+ set_time(gpstime);
+ printf("time adjust %d -> %d\r\n", s, gpstime);
+ }
+ }
+}
+
+int main() {
+ int count = 0;
+ Timer t;
+
+ PHY_PowerDown();
+// Peripheral_PowerDown(LPC1768_PCONP_PCUSB|LPC1768_PCONP_PCENET|LPC1768_PCONP_PCI2S);
+ Peripheral_PowerDown(LPC1768_PCONP_PCENET|LPC1768_PCONP_PCI2S);
+ sw[0].mode(PullUp);
+ sw[1].mode(PullUp);
+ sw[2].mode(PullUp);
+ memset(&stat, 0, sizeof(stat));
+ pc.baud(115200);
+ pc.printf("--- Drone Ground ---\r\n");
+
+ center();
+ oled.printf("Suga koubou - Drone");
+
+ if (initRf()) {
+ oled.cls();
+ oled.printf("*** RF error!");
+ fault();
+ }
+ initGps();
+
+ wait_ms(500);
+ adjust();
+ initMsd();
+ led1 = 1;
+
+ t.start();
+ for (;;) {
+ pollRf();
+
+ if (t.read_ms() >= (rf_dual == 3 ? 100 : 200)) {
+ t.reset();
+
+ // stick
+ input();
+ // send
+ if (sendRf(&send_data)) {
+ led4 = 1;
+ led5 = 1;
+ } else {
+ led4 = 0;
+ }
+ led1 = !led1;
+
+ if (received) {
+ // oled
+ display();
+ led5 = 0;
+ received = 0;
+ count = 0;
+ } else {
+ count ++;
+ if (count > 20) {
+ // lost
+ led5 = 1;
+ }
+ if (count % 2 == 0) {
+ display();
+ }
+ if (count % 10 == 0) {
+ log();
+ }
+ }
+
+ // clock
+ adjust();
+ }
+
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Thu May 19 09:03:44 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/99a22ba036c9 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/naza.cpp Thu May 19 09:03:44 2016 +0000
@@ -0,0 +1,70 @@
+#include "mbed.h"
+#include "Naza.h"
+#include "drone.h"
+#include <math.h>
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+extern struct Status stat;
+
+void parseGps (uint8_t *buf) {
+ struct Naza_Gps *gps = (struct Naza_Gps *)buf;
+
+ if (gps->mask != 0) return; // mask
+/*
+for (int i = 0; i < 60; i ++) {
+ printf(" %02x", buf[i]);
+}
+printf("\r\n");
+*/
+ if (gps->datetime) {
+ stat.gps_date = 20000000 + ((gps->datetime >> 25) & 0x3f) * 10000 + ((gps->datetime >> 21) & 0x0f) * 100 + ((gps->datetime >> 16) & 0x1f);
+ stat.gps_time = ((gps->datetime >> 12) & 0x0f) * 10000 + ((gps->datetime >> 6) & 0x3f) * 100 + (gps->datetime & 0x3f);
+ }
+
+ stat.gps_lng = gps->longitude;
+ stat.gps_lat = gps->latitude;
+ stat.gps_h = gps->altitude;
+ stat.gps_sat = gps->satellites;
+ stat.gps_type = gps->fix_type;
+ stat.gps_flg = gps->flags;
+
+ if (stat.gps_lng && (stat.gps_lng < 1225601000 || stat.gps_lng > 1535911000)) { // yonaguni , minamitori
+ stat.gps_lng = 0;
+ stat.gps_lost ++;
+ }
+ if (stat.gps_lat && (stat.gps_lat < 202531000 || stat.gps_lat > 453326000)) { // okinotori , etorofu
+ stat.gps_lat = 0;
+ stat.gps_lost ++;
+ }
+
+ if (stat.gps_type == 2 || stat.gps_type == 3) {
+ stat.gps_lost = 0;
+ } else {
+ stat.gps_lost ++;
+ }
+// printf("%08d %06d lat=%9d lng=%10d h=%4d sat=%d type=%d flg=%d\r\n",
+// stat.gps_date, stat.gps_time, stat.gps_lat, stat.gps_lng, stat.gps_h, stat.gps_sat, stat.gps_type, stat.gps_flg);
+}
+
+void parseCompass (uint8_t *buf) {
+ struct Naza_Compass *compass = (struct Naza_Compass *)buf;
+
+ stat.compass_x = compass->x;
+ stat.compass_y = compass->y;
+ stat.compass_z = compass->z;
+ float mg = sqrtf(stat.compass_x * stat.compass_x + stat.compass_y * stat.compass_y);
+ stat.compass = atanf((stat.compass_y / mg) / (stat.compass_x / mg)) * 180.0 / M_PI;
+
+ if (stat.compass_x >= 0) {
+ if (stat.compass_y <= 0) {
+ stat.compass = -stat.compass;
+ } else {
+ stat.compass = 360 - stat.compass;
+ }
+ } else {
+ stat.compass = 180 - stat.compass;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/rf920.cpp Thu May 19 09:03:44 2016 +0000
@@ -0,0 +1,103 @@
+#include "mbed.h"
+#include "drone.h"
+#include "NECnfc.h"
+
+#define RF_CHANNEL 34
+#define RF_CHANNEL2 30
+
+NECnfc rf(p13, p14, p11, p12, NC, 38400, NECnfc::TYPE_920MHz); // tx, rx, reset, wakeup, mode
+//cts 12, rts 13
+NECnfc rf2(p9, p10, NC, 38400, NECnfc::TYPE_920MHz); // tx, rx, reset, wakeup, mode
+
+//static int air = NEC_DUMMYID;
+const static int air = 0x4b800063;
+static int seq = 1;
+
+extern int rf_dual;
+
+void isrRecv () {
+ char buf[NEC_MAXLENGTH + 1];
+ int i, len, dest, src;
+ uint8_t sum = 0;
+
+ len = rf.readData(&dest, &src, buf, sizeof(buf));
+ if (len <= 0) return;
+
+ for (i = 0; i < len; i ++) {
+ sum += (uint8_t)buf[i];
+ }
+ if (sum) return; // sum error
+ if (strncmp(buf, "Suge", 4) != NULL) return;
+ rf_dual &= ~2;
+
+ len --;
+ buf[len] = 0;
+ if (air != src) {
+// air = src;
+ printf("new air %08x\r\n", air);
+ }
+// recvRf((struct GroundData *)buf, rf.getRssi());
+ recvRf((struct GroundData *)buf, 0);
+}
+
+void isrRecv2 () {
+ char buf[NEC_MAXLENGTH + 1];
+ int i, len, dest, src;
+ uint8_t sum = 0;
+
+ len = rf2.readData(&dest, &src, buf, sizeof(buf));
+ if (len <= 0) return;
+
+ if (strncmp(buf, "Suge", 4) != NULL) return;
+ rf_dual |= 2;
+
+ for (i = 0; i < len; i ++) {
+ sum += (uint8_t)buf[i];
+ }
+ if (sum) return; // sum error
+
+ len --;
+ buf[len] = 0;
+// recvRf((struct GroundData *)buf, rf2.getRssi());
+ recvRf((struct GroundData *)buf, 0);
+}
+
+int sendRf (struct AirData *send_data) {
+ int i;
+ uint8_t sum = 0;
+ char *buf = (char*)send_data;
+
+ memcpy(send_data->magic, "Suge", 4);
+ send_data->type = DATA_TYPE_AIR;
+ send_data->seq = seq;
+ seq ++;
+ if (seq >= 0x10000) seq = 1;
+ send_data->flags = rf_dual;
+
+ for (i = 0; i < sizeof(struct AirData) - 1; i ++) {
+ sum += (uint8_t)buf[i];
+ }
+ send_data->sum = ~sum + 1; // two's complement
+
+ return rf.sendData(air, buf, sizeof(struct AirData));
+}
+
+void pollRf () {
+ rf.poll();
+ rf2.poll();
+}
+
+int initRf () {
+ if (rf.setRfConfig(NECnfc::PWR_MAX, RF_CHANNEL, NECnfc::BAUD_50k)) return -1;
+ rf.attach(&isrRecv);
+ printf("RF %08x\r\n", rf.getId());
+
+ if (rf2.setRfConfig(NECnfc::PWR_MAX, RF_CHANNEL2, NECnfc::BAUD_50k)) {;
+ printf("RF2 error\r\n");
+ } else {
+ rf2.attach(&isrRecv2);
+ printf("RF2 %08x\r\n", rf2.getId());
+ rf_dual |= 1;
+ }
+ return 0;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmsd.cpp Thu May 19 09:03:44 2016 +0000
@@ -0,0 +1,82 @@
+#include "mbed.h"
+#include "drone.h"
+#include "USBHostMSD.h"
+
+Thread *thread_msd;
+volatile int log_flg = 0;
+char log_buf[256];
+
+extern struct AirData send_data;
+extern struct Status stat, stat_gnd;
+
+void log () {
+ time_t sec = time(NULL);
+ struct tm *t = localtime(&sec);
+
+ snprintf(log_buf, sizeof(log_buf), "%04d%02d%02d,%02d%02d%02d", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
+
+ snprintf(&log_buf[15], sizeof(log_buf) - 15, ",G,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
+ stat_gnd.gps_lat, stat_gnd.gps_lng, stat_gnd.gps_h, stat_gnd.gps_sat, stat_gnd.gps_type,
+ send_data.aileron, send_data.elevator, send_data.throttle, send_data.rudder,
+ send_data.analog1, send_data.analog2, send_data.sw1, send_data.sw2
+ );
+ snprintf(&log_buf[strlen(log_buf)], sizeof(log_buf) - strlen(log_buf), ",A,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\r\n",
+ stat.gps_lat, stat.gps_lng, stat.gps_h,
+ stat.gps_sat, stat.gps_type, stat.gps_flg, stat.gps_lost,
+ stat.compass_x, stat.compass_y, stat.compass_z, stat.compass,
+ stat.uptime, stat.battery, stat.current, stat.amphour, stat.distance1, stat.distance2
+ );
+
+// printf(log_buf);
+ log_flg = strlen(log_buf);
+}
+
+void taskMsd (void const *args) {
+ int num;
+ FILE *fp;
+ char buf[20];
+ USBHostMSD msd("usb");
+
+ for (;;) {
+ // usb connect
+ while(! msd.connect()) {
+ Thread::wait(500);
+ }
+
+ num = 1;
+ fp = fopen("/usb/seq.txt", "r");
+ if (fp) {
+ if (fgets(buf, sizeof(buf), fp) != NULL) {
+ num = atoi(buf);
+ if (! num) num = 1;
+ }
+ fclose(fp);
+ }
+ fp = fopen("/usb/seq.txt", "w");
+ if (fp) {
+ fprintf(fp, "%d", num + 1);
+ fclose(fp);
+ }
+ // filename
+ sprintf(buf, "/usb/drone%03d.log", num);
+ printf("log: %s\r\n", buf);
+
+ while (msd.connected()) {
+ if (log_flg) {
+ // log
+ fp = fopen(buf, "a");
+ if (fp) {
+ fwrite(log_buf, sizeof(char), log_flg, fp);
+ fclose(fp);
+ }
+ log_flg = 0;
+ }
+
+ Thread::wait(1);
+ }
+ }
+}
+
+int initMsd () {
+ thread_msd = new Thread(taskMsd, NULL, osPriorityNormal, 1024 * 4);
+}