diff --git a/firmware/w6300/w6300.cpp b/firmware/w6300/w6300.cpp index 43bb48f..d930d17 100644 --- a/firmware/w6300/w6300.cpp +++ b/firmware/w6300/w6300.cpp @@ -255,17 +255,11 @@ constexpr uint8_t PHY_LINK_ON = 1; constexpr uint8_t PHY_POWER_NORM = 0; constexpr uint8_t PHY_POWER_DOWN = 1; -constexpr uint8_t PACK_NONE = static_cast(pack_info::none); -constexpr uint8_t PACK_FIRST = static_cast(pack_info::first); -constexpr uint8_t PACK_REMAINED = static_cast(pack_info::remained); -constexpr uint8_t PACK_COMPLETED = static_cast(pack_info::completed); -constexpr uint8_t PACK_IPv6 = static_cast(pack_info::ipv6); - - -enum sockint_kind { sik_connected = 1, sik_disconnected = 2, sik_received = 4, sik_timeout = 8, sik_sent = 16, sik_all = 0x1F }; - - -constexpr uint8_t TCPSOCK_MODE = static_cast(tcp_sock_info::mode); +constexpr uint8_t PACK_NONE = 0x00; +constexpr uint8_t PACK_FIRST = 1 << 1; +constexpr uint8_t PACK_REMAINED = 1 << 2; +constexpr uint8_t PACK_COMPLETED = 1 << 3; +constexpr uint8_t PACK_IPv6 = 1 << 7; constexpr uint8_t SPI_READ = (0x00 << 5); constexpr uint8_t SPI_WRITE = (0x01 << 5); @@ -913,27 +907,8 @@ void recv_ignore(uint8_t sn, uint16_t len) { } -void mdio_write(uint8_t phyregaddr, uint16_t var) { - set_phyrar(phyregaddr); - set_phydir(var); - set_phyacr(PHYACR_WRITE); - while (get_phyacr()); -} - -uint16_t mdio_read(uint8_t phyregaddr) { - set_phyrar(phyregaddr); - set_phyacr(PHYACR_READ); - while (get_phyacr()); - return get_phydor(); -} - } // namespace -static uint8_t dns_[4]; -static uint8_t dns6_[16]; -static ipconf_mode ipmode_; - -static constexpr char CHIP_ID[] = "W6300"; void soft_reset() { @@ -984,196 +959,13 @@ void clear_interrupt(intr_kind intr) { set_slirclr((uint8_t)((uint32_t)intr >> 16)); } -intr_kind get_interrupt() { - uint32_t ret = get_sir(); - ret = (ret << 8) + get_ir(); - ret = (((uint32_t)get_slir()) << 16) | ret; - return (intr_kind)ret; -} - void set_interrupt_mask(intr_kind intr) { set_imr((uint8_t)intr); set_simr((uint8_t)((uint16_t)intr >> 8)); set_slimr((uint8_t)((uint32_t)intr >> 16)); } -intr_kind get_interrupt_mask() { - uint32_t ret = get_simr(); - ret = (ret << 8) + get_imr(); - ret = (((uint32_t)get_slimr()) << 16) | ret; - return (intr_kind)ret; -} -int8_t get_phy_link() { - if (mdio_read(PHYRAR_BMSR) & BMSR_LINK_STATUS) return PHY_LINK_ON; - return PHY_LINK_OFF; -} - -int8_t get_phy_power_mode() { - if (mdio_read(PHYRAR_BMCR) & BMCR_PWDN) return PHY_POWER_DOWN; - return PHY_POWER_NORM; -} - -void reset_phy() { - mdio_write(PHYRAR_BMCR, mdio_read(PHYRAR_BMCR) | BMCR_RST); - while (mdio_read(PHYRAR_BMCR) & BMCR_RST); -} - -void set_phy_conf(const phy_conf& phyconf) { - uint16_t tmp = mdio_read(PHYRAR_BMCR); - if (phyconf.mode == PHY_MODE_TE) { - set_phycr1(get_phycr1() | PHYCR1_TE); - set_phycr0(PHYCR0_AUTO); - } else { - set_phycr1(get_phycr1() & ~PHYCR1_TE); - if (phyconf.mode == PHY_MODE_AUTONEGO) { - tmp |= BMCR_ANE; - } else { - tmp &= ~(BMCR_ANE | BMCR_DPX | BMCR_SPD); - if (phyconf.duplex == PHY_DUPLEX_FULL) tmp |= BMCR_DPX; - if (phyconf.speed == PHY_SPEED_100) tmp |= BMCR_SPD; - } - mdio_write(PHYRAR_BMCR, tmp); - } -} - -phy_conf get_phy_conf() { - phy_conf result; - uint16_t tmp = mdio_read(PHYRAR_BMCR); - result.mode = (get_phycr1() & PHYCR1_TE) ? PHY_MODE_TE : ((tmp & BMCR_ANE) ? PHY_MODE_AUTONEGO : PHY_MODE_MANUAL); - result.duplex = (tmp & BMCR_DPX) ? PHY_DUPLEX_FULL : PHY_DUPLEX_HALF; - result.speed = (tmp & BMCR_SPD) ? PHY_SPEED_100 : PHY_SPEED_10; - return result; -} - -phy_conf get_phy_status() { - phy_conf result; - uint8_t tmp = get_physr(); - result.mode = (get_phycr1() & PHYCR1_TE) ? PHY_MODE_TE : ((tmp & (1 << 5)) ? PHY_MODE_MANUAL : PHY_MODE_AUTONEGO); - result.speed = (tmp & PHYSR_SPD) ? PHY_SPEED_10 : PHY_SPEED_100; - result.duplex = (tmp & PHYSR_DPX) ? PHY_DUPLEX_HALF : PHY_DUPLEX_FULL; - return result; -} - -void set_phy_power_mode(uint8_t pmode) { - uint16_t tmp = mdio_read(PHYRAR_BMCR); - if (pmode == PHY_POWER_DOWN) tmp |= BMCR_PWDN; - else tmp &= ~BMCR_PWDN; - mdio_write(PHYRAR_BMCR, tmp); -} - -void set_net_info(const net_info& p) { - set_shar(const_cast(p.mac.data())); set_gar(const_cast(p.gw.data())); - set_subr(const_cast(p.sn.data())); set_sipr(const_cast(p.ip.data())); - set_ga6r(const_cast(p.gw6.data())); set_sub6r(const_cast(p.sn6.data())); - set_llar(const_cast(p.lla.data())); set_guar(const_cast(p.gua.data())); - memcpy(dns_, p.dns.data(), 4); - memcpy(dns6_, p.dns6.data(), 16); - ipmode_ = p.ipmode; -} - -net_info get_net_info() { - net_info p = {}; - get_shar(p.mac.data()); get_gar(p.gw.data()); get_subr(p.sn.data()); get_sipr(p.ip.data()); - get_ga6r(p.gw6.data()); get_sub6r(p.sn6.data()); get_llar(p.lla.data()); get_guar(p.gua.data()); - memcpy(p.dns.data(), dns_, 4); - memcpy(p.dns6.data(), dns6_, 16); - p.ipmode = ipmode_; - return p; -} - -void set_net_mode(netmode_type netmode) { - uint32_t tmp = (uint32_t)netmode; - set_netmr((uint8_t)tmp); - set_netmr2((uint8_t)(tmp >> 8)); - set_net4mr((uint8_t)(tmp >> 16)); - set_net6mr((uint8_t)(tmp >> 24)); -} - -netmode_type get_net_mode() { - uint32_t ret = get_netmr(); - ret = (ret << 8) + get_netmr2(); - ret = (ret << 16) + get_net4mr(); - ret = (ret << 24) + get_net6mr(); - return (netmode_type)ret; -} - -void set_timeout(const net_timeout& t) { - set_rcr(t.s_retry_cnt); set_rtr(t.s_time_100us); - set_slrcr(t.sl_retry_cnt); set_slrtr(t.sl_time_100us); -} - -net_timeout get_timeout() { - return {get_rcr(), get_rtr(), get_slrcr(), get_slrtr()}; -} - -int8_t send_arp(arp_request& arp) { - uint8_t tmp; - if (arp.destinfo.len == 16) { set_sldip6r(const_cast(arp.destinfo.ip.data())); set_slcr(SLCR_ARP6); } - else { set_sldip4r(const_cast(arp.destinfo.ip.data())); set_slcr(SLCR_ARP4); } - while (get_slcr()); - while ((tmp = get_slir()) == 0x00); - set_slirclr(~SLIR_RA); - if (tmp & (SLIR_ARP4 | SLIR_ARP6)) { get_sldhar(arp.dha.data()); return 0; } - return -1; -} - -int8_t send_ping(const ping_request& ping) { - uint8_t tmp; - set_pingidr(ping.id); set_pingseqr(ping.seq); - if (ping.destinfo.len == 16) { set_sldip6r(const_cast(ping.destinfo.ip.data())); set_slcr(SLCR_PING6); } - else { set_sldip4r(const_cast(ping.destinfo.ip.data())); set_slcr(SLCR_PING4); } - while (get_slcr()); - while ((tmp = get_slir()) == 0x00); - set_slirclr(~SLIR_RA); - if (tmp & (SLIR_PING4 | SLIR_PING6)) return 0; - return -1; -} - -int8_t send_dad(std::span ipv6) { - uint8_t tmp; - set_sldip6r(const_cast(ipv6.data())); set_slcr(SLCR_NS); - while (get_slcr()); - while ((tmp = get_slir()) == 0x00); - set_slirclr(~SLIR_RA); - if (tmp & SLIR_TOUT) return 0; - return -1; -} - -int8_t send_slaac(prefix& pfx) { - uint8_t tmp; - set_slcr(SLCR_RS); - while (get_slcr()); - while ((tmp = get_slir()) == 0x00); - set_slirclr(~SLIR_RA); - if (tmp & SLIR_RS) { - pfx.len = get_plr(); pfx.flag = get_pfr(); - pfx.valid_lifetime = get_vltr(); pfx.preferred_lifetime = get_pltr(); - get_par(pfx.prefix.data()); - return 0; - } - return -1; -} - -int8_t send_unsolicited() { - uint8_t tmp; - set_slcr(SLCR_UNA); - while (get_slcr()); - while ((tmp = get_slir()) == 0x00); - set_slirclr(~SLIR_RA); - if (tmp & SLIR_TOUT) return 0; - return -1; -} - -int8_t get_prefix(prefix& pfx) { - if (get_slir() & SLIR_RA) { - pfx.len = get_plr(); pfx.flag = get_pfr(); - pfx.valid_lifetime = get_vltr(); pfx.preferred_lifetime = get_pltr(); - get_par(pfx.prefix.data()); - set_slirclr(SLIR_RA); - } - return -1; -} constexpr uint16_t SOCK_ANY_PORT_NUM = 0xC000; static uint16_t sock_any_port = SOCK_ANY_PORT_NUM; @@ -1193,6 +985,20 @@ uint8_t sock_pack_info[sock_count] = {0,}; #define CHECK_SOCKDATA() do { if(len == 0) FAIL(data_len); } while(0) #define CHECK_IPZERO(addr, addrlen) do { uint16_t ipzero=0; for(uint8_t i=0; i close(socket_id sid) { + uint8_t sn = static_cast(sid); + CHECK_SOCKNUM(); + set_sn_cr(sn, SN_CR_CLOSE); + while (get_sn_cr(sn)); + set_sn_ir(sn, 0xFF); + sock_io_mode_bits &= ~(1 << sn); + sock_is_sending &= ~(1 << sn); + sock_remained_size[sn] = 0; + sock_pack_info[sn] = PACK_NONE; + while (get_sn_sr(sn) != SOCK_CLOSED); + return {}; +} + std::expected open_socket(socket_id sid, protocol proto, port_num port, sock_flag flag) { uint8_t sn = static_cast(sid); uint16_t p = static_cast(port); @@ -1259,168 +1065,11 @@ std::expected open_socket(socket_id sid, protocol proto, sock_io_mode_bits |= ((fl & (static_cast(sock_flag::io_nonblock) >> 3)) << sn); sock_is_sending &= ~(1 << sn); sock_remained_size[sn] = 0; - sock_pack_info[sn] = static_cast(pack_info::completed); + sock_pack_info[sn] = PACK_COMPLETED; while (get_sn_sr(sn) == SOCK_CLOSED); return sid; } -std::expected close(socket_id sid) { - uint8_t sn = static_cast(sid); - CHECK_SOCKNUM(); - set_sn_cr(sn, SN_CR_CLOSE); - while (get_sn_cr(sn)); - set_sn_ir(sn, 0xFF); - sock_io_mode_bits &= ~(1 << sn); - sock_is_sending &= ~(1 << sn); - sock_remained_size[sn] = 0; - sock_pack_info[sn] = PACK_NONE; - while (get_sn_sr(sn) != SOCK_CLOSED); - return {}; -} - -std::expected listen(socket_id sid) { - uint8_t sn = static_cast(sid); - CHECK_SOCKNUM(); - CHECK_TCPMODE(); - CHECK_SOCKINIT(); - set_sn_cr(sn, SN_CR_LISTEN); - while (get_sn_cr(sn)); - while (get_sn_sr(sn) != SOCK_LISTEN) { - close(sid); - FAIL(sock_closed); - } - return {}; -} - -std::expected connect(socket_id sid, const ip_address& addr, port_num port) { - uint8_t sn = static_cast(sid); - uint16_t p = static_cast(port); - uint8_t addrlen = addr.len; - CHECK_SOCKNUM(); - CHECK_TCPMODE(); - CHECK_SOCKINIT(); - CHECK_IPZERO(addr.ip.data(), addrlen); - if (p == 0) FAIL(port_zero); - - set_sn_dportr(sn, p); - if (addrlen == 16) { - if (get_sn_mr(sn) & 0x08) { - set_sn_dip6r(sn, const_cast(addr.ip.data())); - set_sn_cr(sn, SN_CR_CONNECT6); - } else { - FAIL(sock_mode); - } - } else { - if (get_sn_mr(sn) == SN_MR_TCP6) FAIL(sock_mode); - set_sn_dipr(sn, const_cast(addr.ip.data())); - set_sn_cr(sn, SN_CR_CONNECT); - } - while (get_sn_cr(sn)); - if (sock_io_mode_bits & (1 << sn)) FAIL(busy); - while (get_sn_sr(sn) != SOCK_ESTABLISHED) { - if (get_sn_ir(sn) & SN_IR_TIMEOUT) { - set_sn_ir(sn, SN_IR_TIMEOUT); - FAIL(timeout); - } - if (get_sn_sr(sn) == SOCK_CLOSED) FAIL(sock_closed); - } - return {}; -} - -std::expected disconnect(socket_id sid) { - uint8_t sn = static_cast(sid); - CHECK_SOCKNUM(); - CHECK_TCPMODE(); - if (get_sn_sr(sn) != SOCK_CLOSED) { - set_sn_cr(sn, SN_CR_DISCON); - while (get_sn_cr(sn)); - sock_is_sending &= ~(1 << sn); - if (sock_io_mode_bits & (1 << sn)) FAIL(busy); - while (get_sn_sr(sn) != SOCK_CLOSED) { - if (get_sn_ir(sn) & SN_IR_TIMEOUT) { - close(sid); - FAIL(timeout); - } - } - } - return {}; -} - -std::expected send(socket_id sid, std::span buf) { - uint8_t sn = static_cast(sid); - uint8_t tmp = 0; - uint16_t freesize = 0; - uint16_t len = buf.size(); - - freesize = get_sn_tx_max(sn); - if (len > freesize) len = freesize; - while (1) { - freesize = (uint16_t)get_sn_tx_fsr(sn); - tmp = get_sn_sr(sn); - if ((tmp != SOCK_ESTABLISHED) && (tmp != SOCK_CLOSE_WAIT)) { - if (tmp == SOCK_CLOSED) close(sid); - FAIL(sock_status); - } - if ((sock_io_mode_bits & (1 << sn)) && (len > freesize)) FAIL(busy); - if (len <= freesize) break; - } - send_data(sn, const_cast(buf.data()), len); - if (sock_is_sending & (1 << sn)) { - while (!(get_sn_ir(sn) & SN_IR_SENDOK)) { - tmp = get_sn_sr(sn); - if ((tmp != SOCK_ESTABLISHED) && (tmp != SOCK_CLOSE_WAIT)) { - if ((tmp == SOCK_CLOSED) || (get_sn_ir(sn) & SN_IR_TIMEOUT)) close(sid); - FAIL(sock_status); - } - if (sock_io_mode_bits & (1 << sn)) FAIL(busy); - } - set_sn_ir(sn, SN_IR_SENDOK); - } - set_sn_cr(sn, SN_CR_SEND); - while (get_sn_cr(sn)); - sock_is_sending |= (1 << sn); - return len; -} - -std::expected recv(socket_id sid, std::span buf) { - uint8_t sn = static_cast(sid); - uint16_t len = buf.size(); - uint8_t tmp = 0; - uint16_t recvsize = 0; - - CHECK_SOCKNUM(); - CHECK_SOCKMODE(SN_MR_TCP); - CHECK_SOCKDATA(); - - recvsize = get_sn_rx_max(sn); - if (recvsize < len) len = recvsize; - - while (1) { - recvsize = (uint16_t)get_sn_rx_rsr(sn); - tmp = get_sn_sr(sn); - if (tmp != SOCK_ESTABLISHED) { - if (tmp == SOCK_CLOSE_WAIT) { - if (recvsize != 0) break; - else if (get_sn_tx_fsr(sn) == get_sn_tx_max(sn)) { - close(sid); - FAIL(sock_status); - } - } else { - close(sid); - FAIL(sock_status); - } - } - if (recvsize != 0) break; - if (sock_io_mode_bits & (1 << sn)) FAIL(busy); - }; - - if (recvsize < len) len = recvsize; - recv_data(sn, buf.data(), len); - set_sn_cr(sn, SN_CR_RECV); - while (get_sn_cr(sn)); - return len; -} - std::expected sendto(socket_id sid, std::span buf, const ip_address& addr, port_num port) { uint8_t sn = static_cast(sid); uint16_t p = static_cast(port); @@ -1592,27 +1241,6 @@ std::expected recvfrom(socket_id sid, std::span b } -std::optional peek_socket_msg(socket_id sid, std::span submsg) { - uint16_t subsize = submsg.size(); - uint8_t sn = static_cast(sid); - uint32_t rx_ptr = 0; - uint16_t i = 0, sub_idx = 0; - if ((get_sn_rx_rsr(sn) > 0) && (subsize > 0)) { - rx_ptr = ((uint32_t)get_sn_rx_rd(sn) << 8) + RXBUF_BLOCK(sn); - sub_idx = 0; - for (i = 0; i < get_sn_rx_rsr(sn); i++) { - if (reg_read(rx_ptr) == submsg[sub_idx]) { - sub_idx++; - if (sub_idx == subsize) return static_cast(i + 1 - sub_idx); - } else { - sub_idx = 0; - } - rx_ptr = offset_inc(rx_ptr, 1); - } - } - return std::nullopt; -} - void reset() { gpio_init(PIN_RST); gpio_set_dir(PIN_RST, GPIO_OUT); @@ -1641,13 +1269,6 @@ bool check() { return get_cidr() == 0x6300; } -void init_net(const net_info& info) { - chip_unlock(); - net_unlock(); - set_net_info(info); -} - - std::expected set_socket_io_mode(socket_id sid, sock_io_mode mode) { uint8_t sn = static_cast(sid); if (sn >= sock_count) FAIL(sock_num); @@ -1657,161 +1278,12 @@ std::expected set_socket_io_mode(socket_id sid, sock_io_mode m return {}; } -sock_io_mode get_socket_io_mode(socket_id sid) { - uint8_t sn = static_cast(sid); - return static_cast((sock_io_mode_bits >> sn) & 0x01); -} - -uint16_t get_socket_max_tx(socket_id sid) { - return get_sn_tx_max(static_cast(sid)); -} - -uint16_t get_socket_max_rx(socket_id sid) { - return get_sn_rx_max(static_cast(sid)); -} - -std::expected clear_socket_interrupt(socket_id sid, uint8_t flags) { - uint8_t sn = static_cast(sid); - if (sn >= sock_count) FAIL(sock_num); - if (flags > sik_all) FAIL(arg); - set_sn_ir(sn, flags); - return {}; -} - -uint8_t get_socket_interrupt(socket_id sid) { - return get_sn_ir(static_cast(sid)); -} - -std::expected set_socket_interrupt_mask(socket_id sid, uint8_t mask) { - uint8_t sn = static_cast(sid); - if (sn >= sock_count) FAIL(sock_num); - if (mask > sik_all) FAIL(arg); - set_sn_imr(sn, mask); - return {}; -} - -uint8_t get_socket_interrupt_mask(socket_id sid) { - return get_sn_imr(static_cast(sid)); -} - -std::expected set_socket_prefer(socket_id sid, srcv6_prefer pref) { - uint8_t sn = static_cast(sid); - if (sn >= sock_count) FAIL(sock_num); - uint8_t v = static_cast(pref); - if ((v & 0x03) == 0x01) FAIL(arg); - set_sn_psr(sn, v); - return {}; -} - -srcv6_prefer get_socket_prefer(socket_id sid) { - return static_cast(get_sn_psr(static_cast(sid))); -} - -void set_socket_ttl(socket_id sid, uint8_t ttl) { - set_sn_ttl(static_cast(sid), ttl); -} - -uint8_t get_socket_ttl(socket_id sid) { - return get_sn_ttl(static_cast(sid)); -} - -void set_socket_tos(socket_id sid, uint8_t tos) { - set_sn_tos(static_cast(sid), tos); -} - -uint8_t get_socket_tos(socket_id sid) { - return get_sn_tos(static_cast(sid)); -} - -void set_socket_mss(socket_id sid, uint16_t mss) { - set_sn_mssr(static_cast(sid), mss); -} - -uint16_t get_socket_mss(socket_id sid) { - return get_sn_mssr(static_cast(sid)); -} - void set_socket_dest_mac(socket_id sid, const std::array& mac) { set_sn_dhar(static_cast(sid), const_cast(mac.data())); } -void set_socket_dest_ip(socket_id sid, const ip_address& addr) { - uint8_t sn = static_cast(sid); - if (addr.len == 16) set_sn_dip6r(sn, const_cast(addr.ip.data())); - else set_sn_dipr(sn, const_cast(addr.ip.data())); -} - -ip_address get_socket_dest_ip(socket_id sid) { - uint8_t sn = static_cast(sid); - ip_address addr = {}; - if (get_sn_esr(sn) & TCPSOCK_MODE) { - get_sn_dip6r(sn, addr.ip.data()); - addr.len = 16; - } else { - get_sn_dipr(sn, addr.ip.data()); - addr.len = 4; - } - return addr; -} - -void set_socket_dest_port(socket_id sid, port_num port) { - set_sn_dportr(static_cast(sid), static_cast(port)); -} - -port_num get_socket_dest_port(socket_id sid) { - return static_cast(get_sn_dportr(static_cast(sid))); -} - -std::expected send_keepalive(socket_id sid) { - uint8_t sn = static_cast(sid); - if ((get_sn_mr(sn) & 0x03) != 0x01) FAIL(sock_mode); - if (get_sn_kpalvtr(sn) != 0) FAIL(sock_opt); - set_sn_cr(sn, SN_CR_SEND_KEEP); - while (get_sn_cr(sn) != 0) { - if (get_sn_ir(sn) & SN_IR_TIMEOUT) { - set_sn_ir(sn, SN_IR_TIMEOUT); - FAIL(timeout); - } - } - return {}; -} - -void set_socket_keepalive_auto(socket_id sid, uint8_t interval) { - set_sn_kpalvtr(static_cast(sid), interval); -} - -uint8_t get_socket_keepalive_auto(socket_id sid) { - return get_sn_kpalvtr(static_cast(sid)); -} - -uint16_t get_socket_send_buf(socket_id sid) { - return get_sn_tx_fsr(static_cast(sid)); -} - uint16_t get_socket_recv_buf(socket_id sid) { return get_sn_rx_rsr(static_cast(sid)); } -uint8_t get_socket_status(socket_id sid) { - return get_sn_sr(static_cast(sid)); -} - -uint8_t get_socket_ext_status(socket_id sid) { - return get_sn_esr(static_cast(sid)) & 0x07; -} - -uint8_t get_socket_mode(socket_id sid) { - return get_sn_mr(static_cast(sid)) & 0x0F; -} - -uint16_t get_socket_remain_size(socket_id sid) { - uint8_t sn = static_cast(sid); - if (get_sn_mr(sn) & 0x01) return get_sn_rx_rsr(sn); - return sock_remained_size[sn]; -} - -pack_info get_socket_pack_info(socket_id sid) { - return static_cast(sock_pack_info[static_cast(sid)]); -} - } // namespace w6300 diff --git a/firmware/w6300/w6300.h b/firmware/w6300/w6300.h index 212431b..a62e078 100644 --- a/firmware/w6300/w6300.h +++ b/firmware/w6300/w6300.h @@ -2,7 +2,6 @@ #include #include #include -#include #include namespace w6300 { @@ -65,35 +64,6 @@ constexpr uint8_t operator&(sock_flag a, sock_flag b) { return static_cast(a) & static_cast(b); } -enum class pack_info : uint8_t { - none = 0x00, - first = 1 << 1, - remained = 1 << 2, - completed = 1 << 3, - ipv6_lla = (1 << 7) | (1 << 4), - ipv6_multi = (1 << 7) | (1 << 5), - ipv6_allnode = (1 << 7) | (1 << 6), - ipv6 = 1 << 7, -}; -constexpr pack_info operator|(pack_info a, pack_info b) { - return static_cast(static_cast(a) | static_cast(b)); -} -constexpr uint8_t operator&(pack_info a, pack_info b) { - return static_cast(a) & static_cast(b); -} - -enum class srcv6_prefer : uint8_t { - auto_select = 0x00, - lla = 0x02, - gua = 0x03, -}; - -enum class tcp_sock_info : uint8_t { - mode = 1 << 2, - op = 1 << 1, - sip = 1 << 0, -}; - enum class sock_io_mode : uint8_t { block = 0, nonblock = 1, @@ -111,158 +81,26 @@ enum intr_kind : uint32_t { ik_int_all = 0x00FFFF97 }; -struct phy_conf { - uint8_t by; - uint8_t mode; - uint8_t speed; - uint8_t duplex; -}; - -enum ipconf_mode : uint8_t { - ipconf_none = 0x00, ipconf_static_v4 = 0x01, ipconf_static_v6 = 0x02, - ipconf_static_all = 0x03, ipconf_slaac_v6 = 0x04, - ipconf_dhcp_v4 = 0x10, ipconf_dhcp_v6 = 0x20, ipconf_dhcp_all = 0x30 -}; - -enum dhcp_mode : uint8_t { dhcp_static = 1, dhcp_dynamic }; - -struct net_info { - std::array mac; - std::array ip; - std::array sn; - std::array gw; - std::array lla; - std::array gua; - std::array sn6; - std::array gw6; - std::array dns; - std::array dns6; - ipconf_mode ipmode; - dhcp_mode dhcp; -}; - -enum netmode_type : uint32_t { - nm_ipb_v4 = (1 << 0), nm_ipb_v6 = (1 << 1), nm_wol = (1 << 2), - nm_pb6_multi = (1 << 4), nm_pb6_allnode = (1 << 5), nm_mr_mask = 0x37, - nm_pppoe = (1 << 8), nm_dha_select = (1 << 15), nm_mr2_mask = (0x09 << 8), - nm_pb4_all = (1 << 16), nm_trstb_v4 = (1 << 17), nm_parp_v4 = (1 << 18), - nm_unrb_v4 = (1 << 19), nm_net4_mask = (0x0F << 16), - nm_pb6_all = (1 << 24), nm_trstb_v6 = (1 << 25), nm_parp_v6 = (1 << 26), - nm_unrb_v6 = (1 << 27), nm_net6_mask = (0x0F << 24), - nm_mask_all = 0x0F0F0937 -}; - -struct net_timeout { - uint8_t s_retry_cnt; - uint16_t s_time_100us; - uint8_t sl_retry_cnt; - uint16_t sl_time_100us; -}; - struct ip_address { std::array ip; uint8_t len; }; -struct prefix { - uint8_t len; - uint8_t flag; - uint32_t valid_lifetime; - uint32_t preferred_lifetime; - std::array prefix; -}; - -struct arp_request { - ip_address destinfo; - std::array dha; -}; - -struct ping_request { - uint16_t id; - uint16_t seq; - ip_address destinfo; -}; - void init_spi(); void init_critical_section(); void reset(); void init(); bool check(); -void init_net(const net_info& info); -void soft_reset(); -int8_t init_buffers(std::span txsize, std::span rxsize); void clear_interrupt(intr_kind intr); -intr_kind get_interrupt(); void set_interrupt_mask(intr_kind intr); -intr_kind get_interrupt_mask(); - -int8_t get_phy_link(); -int8_t get_phy_power_mode(); -void reset_phy(); -void set_phy_conf(const phy_conf& conf); -phy_conf get_phy_conf(); -phy_conf get_phy_status(); -void set_phy_power_mode(uint8_t pmode); - -void set_net_info(const net_info& info); -net_info get_net_info(); -void set_net_mode(netmode_type mode); -netmode_type get_net_mode(); -void set_timeout(const net_timeout& timeout); -net_timeout get_timeout(); - -int8_t send_arp(arp_request& arp); -int8_t send_ping(const ping_request& ping); -int8_t send_dad(std::span ipv6); -int8_t send_slaac(prefix& pfx); -int8_t send_unsolicited(); -int8_t get_prefix(prefix& pfx); std::expected open_socket(socket_id sn, protocol proto, port_num port, sock_flag flag); -std::expected close(socket_id sn); -std::expected listen(socket_id sn); -std::expected disconnect(socket_id sn); -std::expected send(socket_id sn, std::span buf); -std::expected recv(socket_id sn, std::span buf); - -std::expected connect(socket_id sn, const ip_address& addr, port_num port); std::expected sendto(socket_id sn, std::span buf, const ip_address& addr, port_num port); std::expected recvfrom(socket_id sn, std::span buf, ip_address& addr, port_num& port); std::expected set_socket_io_mode(socket_id sn, sock_io_mode mode); -sock_io_mode get_socket_io_mode(socket_id sn); -uint16_t get_socket_max_tx(socket_id sn); -uint16_t get_socket_max_rx(socket_id sn); -std::expected clear_socket_interrupt(socket_id sn, uint8_t flags); -uint8_t get_socket_interrupt(socket_id sn); -std::expected set_socket_interrupt_mask(socket_id sn, uint8_t mask); -uint8_t get_socket_interrupt_mask(socket_id sn); -std::expected set_socket_prefer(socket_id sn, srcv6_prefer pref); -srcv6_prefer get_socket_prefer(socket_id sn); - -void set_socket_ttl(socket_id sn, uint8_t ttl); -uint8_t get_socket_ttl(socket_id sn); -void set_socket_tos(socket_id sn, uint8_t tos); -uint8_t get_socket_tos(socket_id sn); -void set_socket_mss(socket_id sn, uint16_t mss); -uint16_t get_socket_mss(socket_id sn); void set_socket_dest_mac(socket_id sn, const std::array& mac); -void set_socket_dest_ip(socket_id sn, const ip_address& addr); -ip_address get_socket_dest_ip(socket_id sn); -void set_socket_dest_port(socket_id sn, port_num port); -port_num get_socket_dest_port(socket_id sn); -std::expected send_keepalive(socket_id sn); -void set_socket_keepalive_auto(socket_id sn, uint8_t interval); -uint8_t get_socket_keepalive_auto(socket_id sn); -uint16_t get_socket_send_buf(socket_id sn); uint16_t get_socket_recv_buf(socket_id sn); -uint8_t get_socket_status(socket_id sn); -uint8_t get_socket_ext_status(socket_id sn); -uint8_t get_socket_mode(socket_id sn); -uint16_t get_socket_remain_size(socket_id sn); -pack_info get_socket_pack_info(socket_id sn); - -std::optional peek_socket_msg(socket_id sn, std::span submsg); } // namespace w6300