Ralink系列网卡芯片全面技术分析
一、Ralink有线网卡芯片历程与规格
主要系列发展历程
RT系列SoC集成以太网 (2004-2014)
-
RT3050/RT3052: 早期MIPS SoC集成10/100M以太网
-
RT5350: 低成本IoT方案,集成Fast Ethernet
-
RT6855/RT6856: 5端口Fast Ethernet交换机方案
MT系列 (MediaTek收购后)
-
MT7620: 2T2R 802.11n + 5端口10/100/1000M交换机
-
MT7621: 双核MIPS + 5端口GbE交换机
-
MT7628: 低成本IoT方案,集成10/100M以太网
技术参数对比
| 芯片型号 | 接口速率 | 总线接口 | 支持特性 | Linux内核支持版本 |
|---|---|---|---|---|
| RT3050 | 10/100M | SoC集成 | 2端口FE交换机 | 2.6.21+ |
| RT3052 | 10/100M | SoC集成 | 5端口FE交换机 | 2.6.25+ |
| RT5350 | 10/100M | SoC集成 | 1端口FE + WiFi | 2.6.36+ |
| MT7620 | 10/100/1000M | SoC集成 | 5端口GbE交换机 | 3.10+ |
| MT7621 | 10/100/1000M | SoC集成 | 5端口GbE交换机 | 3.18+ |
二、Linux内核网络架构与Ralink集成
Ralink以太网驱动架构
// drivers/net/ethernet/ralink/gsw_mt7620.c
struct mt7620_gsw {
struct device *dev;
void __iomem *base;
struct regmap *ethsys;
struct regmap *pctl;
// 端口配置
struct gsw_port ports[MT7620_GSW_NUM_PORTS];
u16 vlan_entries[MT7620_GSW_NUM_VLANS];
// 统计信息
struct gsw_stats stats;
};
static const struct of_device_id mt7620_gsw_match[] = {
{ .compatible = "ralink,mt7620-gsw" },
{ .compatible = "mediatek,mt7620-gsw" },
{},
};
// 交换机操作
static const struct switch_ops mt7620_gsw_ops = {
.get_vlan_ports = mt7620_gsw_get_vlan_ports,
.set_vlan_ports = mt7620_gsw_set_vlan_ports,
.get_port_link = mt7620_gsw_get_port_link,
.get_port_stats = mt7620_gsw_get_port_stats,
.apply_config = mt7620_gsw_apply_config,
.reset_switch = mt7620_gsw_reset_switch,
};
MDIO总线驱动
// drivers/net/ethernet/ralink/mdio_rt2880.c
struct rt2880_priv {
void __iomem *base;
struct device *dev;
struct mii_bus *mii_bus;
spinlock_t lock;
};
static int rt2880_mdio_read(struct mii_bus *bus, int phy_addr, int phy_reg)
{
struct rt2880_priv *priv = bus->priv;
u32 val;
unsigned long flags;
spin_lock_irqsave(&priv->lock, flags);
// 配置MDIO地址
val = (phy_addr << MDIO_CFG_PHY_ADDR_SHIFT) |
(phy_reg << MDIO_CFG_REG_ADDR_SHIFT) |
MDIO_CFG_READ;
writel(val, priv->base + MDIO_CFG);
// 等待操作完成
while (readl(priv->base + MDIO_CFG) & MDIO_CFG_BUSY)
cpu_relax();
val = readl(priv->base + MDIO_RW_DATA);
spin_unlock_irqrestore(&priv->lock, flags);
return val & 0xffff;
}
三、性能优化技术架构
NAPI实现
// drivers/net/ethernet/ralink/esw_rt3050.c
static int rt3050_esw_poll(struct napi_struct *napi, int budget)
{
struct rt3050_esw *esw = container_of(napi, struct rt3050_esw, napi);
struct net_device *dev = esw->netdev;
int work_done = 0;
// 处理接收队列
work_done = rt3050_esw_rx_poll(esw, budget);
// 处理发送完成
rt3050_esw_tx_clean(esw);
if (work_done < budget) {
napi_complete_done(napi, work_done);
rt3050_esw_irq_enable(esw);
}
return work_done;
}
// 中断处理
static irqreturn_t rt3050_esw_interrupt(int irq, void *dev_id)
{
struct rt3050_esw *esw = dev_id;
u32 status;
status = rt3050_esw_get_int_status(esw);
if (!status)
return IRQ_NONE;
// 清除中断状态
rt3050_esw_ack_int(esw, status);
if (status & (ESW_INT_RX_DONE | ESW_INT_TX_DONE)) {
if (napi_schedule_prep(&esw->napi)) {
rt3050_esw_irq_disable(esw);
__napi_schedule(&esw->napi);
}
}
return IRQ_HANDLED;
}
四、USB网卡芯片技术演进
Ralink USB网络解决方案
RT系列USB网卡
-
RT2570/RT2571/RT2573: USB 2.0无线网卡
-
RT3070/RT3072: 单频2.4GHz USB方案
-
RT3370/RT3572: 双频USB方案
-
RT5370/RT5372: 低成本USB方案
Linux USB无线驱动架构
// drivers/net/wireless/ralink/rt2x00/rt2800usb.c
static const struct usb_device_id rt2800usb_device_table[] = {
/* Ralink */
{ USB_DEVICE(0x148f, 0x2570) }, /* RT2570 */
{ USB_DEVICE(0x148f, 0x2573) }, /* RT2573 */
{ USB_DEVICE(0x148f, 0x3070) }, /* RT3070 */
{ USB_DEVICE(0x148f, 0x3071) }, /* RT3071 */
{ USB_DEVICE(0x148f, 0x3072) }, /* RT3072 */
{ USB_DEVICE(0x148f, 0x3370) }, /* RT3370 */
{ USB_DEVICE(0x148f, 0x3572) }, /* RT3572 */
{ USB_DEVICE(0x148f, 0x5370) }, /* RT5370 */
{ USB_DEVICE(0x148f, 0x5372) }, /* RT5372 */
{ /* Sentinel */ }
};
// USB操作结构
static const struct rt2x00lib_ops rt2800usb_rt2x00_ops = {
.probe_hw = rt2800_probe_hw,
.get_firmware_name = rt2800usb_get_firmware_name,
.check_firmware = rt2800_check_firmware,
.load_firmware = rt2800_load_firmware,
.initialize = rt2800_initialize,
.uninitialize = rt2800_uninitialize,
.clear_entry = rt2800_clear_entry,
.set_device_state = rt2800usb_set_device_state,
.rfkill_poll = rt2800_rfkill_poll,
.link_stats = rt2800_link_stats,
.reset_tuner = rt2800_reset_tuner,
.link_tuner = rt2800_link_tuner,
.start_queue = rt2800usb_start_queue,
.kick_queue = rt2800usb_kick_queue,
.stop_queue = rt2800usb_stop_queue,
.flush_queue = rt2800usb_flush_queue,
.tx_dma_done = rt2800usb_tx_dma_done,
};
USB批量传输处理
// drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
static void rt2x00usb_interrupt_rxdone(struct urb *urb)
{
struct rt2x00_dev *rt2x00dev = urb->context;
struct sk_buff *skb;
if (urb->status) {
if (urb->status != -ESHUTDOWN)
rt2x00_dbg(rt2x00dev, "RX urb failed: %d\n", urb->status);
goto submit;
}
if (urb->actual_length < rt2x00dev->rx->desc_size) {
rt2x00_dbg(rt2x00dev, "RX urb too small: %d\n", urb->actual_length);
goto submit;
}
skb = rt2x00dev->rx->skb;
skb_put(skb, urb->actual_length);
// 处理接收帧
if (rt2x00usb_rxdone(rt2x00dev, skb))
dev_kfree_skb(skb);
submit:
// 重新提交URB
if (rt2x00usb_submit_rx_entry(rt2x00dev, rt2x00dev->rx))
rt2x00_dbg(rt2x00dev, "Failed to resubmit RX urb\n");
}
static int rt2x00usb_submit_rx_entry(struct rt2x00_dev *rt2x00dev,
struct data_entry *entry)
{
struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev);
struct urb *urb = entry->urb;
int ret;
usb_fill_bulk_urb(urb, usb_dev, usb_rcvbulkpipe(usb_dev, entry->pipe),
entry->skb->data, entry->skb_tailroom(entry->skb),
rt2x00usb_interrupt_rxdone, rt2x00dev);
ret = usb_submit_urb(urb, GFP_ATOMIC);
if (ret) {
rt2x00_dbg(rt2x00dev, "Failed to submit RX urb: %d\n", ret);
return ret;
}
return 0;
}
五、无线网卡芯片与内核支持
Ralink无线解决方案系列
RT2x00系列 (802.11g时代)
-
RT2400/RT2500: 早期PCI解决方案
-
RT2560/RT2570: 改进的MAC设计
-
RT2661/RT2662: 首款MIMO方案
RT28xx/RT30xx系列 (802.11n时代)
-
RT2800/RT2800E: PCIe 802.11n方案
-
RT2860/RT2890: 集成蓝牙支持
-
RT3070/RT3071/RT3072: USB 802.11n方案
RT33xx/RT35xx系列 (802.11n改进)
-
RT3350/RT3352: 集成SoC方案
-
RT3572/RT3573: 双频支持
-
RT3592/RT3593: 3x3 MIMO支持
Linux无线驱动架构演进
传统rt2x00驱动架构
// drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
struct rt2x00_dev {
struct ieee80211_hw *hw;
struct device *dev;
// 硬件信息
const struct rt2x00_ops *ops;
const struct rt2x00lib_ops *lib;
struct rt2x00_chip chip;
// MAC和RF
struct rt2x00_mac mac;
struct rt2x00_rf rf;
// 队列管理
struct data_queue rx;
struct data_queue tx;
struct data_queue bcn;
// 统计信息
struct rt2x00_stats stats;
};
static const struct ieee80211_ops rt2x00mac_ops = {
.tx = rt2x00mac_tx,
.start = rt2x00mac_start,
.stop = rt2x00mac_stop,
.add_interface = rt2x00mac_add_interface,
.remove_interface = rt2x00mac_remove_interface,
.config = rt2x00mac_config,
.configure_filter = rt2x00mac_configure_filter,
.bss_info_changed = rt2x00mac_bss_info_changed,
.conf_tx = rt2x00mac_conf_tx,
.get_tsf = rt2x00mac_get_tsf,
.set_tsf = rt2x00mac_set_tsf,
.reset_tsf = rt2x00mac_reset_tsf,
.ampdu_action = rt2x00mac_ampdu_action,
.get_survey = rt2x00mac_get_survey,
.rfkill_poll = rt2x00mac_rfkill_poll,
.flush = rt2x00mac_flush,
.set_tim = rt2x00mac_set_tim,
.set_key = rt2x00mac_set_key,
.sw_scan_start = rt2x00mac_sw_scan_start,
.sw_scan_complete = rt2x00mac_sw_scan_complete,
};
固件加载机制
// drivers/net/wireless/ralink/rt2x00/rt2x00firmware.c
int rt2x00lib_load_firmware(struct rt2x00_dev *rt2x00dev)
{
const struct firmware *fw;
char *fw_name;
int ret;
// 构建固件文件名
fw_name = rt2x00dev->ops->lib->get_firmware_name(rt2x00dev);
if (!fw_name) {
rt2x00_err(rt2x00dev, "Invalid firmware filename\n");
return -EINVAL;
}
ret = request_firmware(&fw, fw_name, rt2x00dev->dev);
if (ret) {
rt2x00_err(rt2x00dev, "Failed to request Firmware (%s)\n", fw_name);
return ret;
}
// 验证固件
if (!rt2x00dev->ops->lib->check_firmware(rt2x00dev, fw->data, fw->size)) {
rt2x00_err(rt2x00dev, "Firmware verification failed\n");
release_firmware(fw);
return -ENOENT;
}
// 加载固件到设备
ret = rt2x00dev->ops->lib->load_firmware(rt2x00dev, fw->data, fw->size);
release_firmware(fw);
return ret;
}
// RT2870固件处理
static int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
const u8 *data, const size_t len)
{
u32 reg;
int i;
// 检查固件有效性
if (len < 4 || len > 4096) {
rt2x00_err(rt2x00dev, "Firmware has invalid size\n");
return -ENOENT;
}
// 启用主机模式
rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
rt2800_register_write(rt2x00dev, H2M_INT_SRC, 0);
// 上传固件
for (i = 0; i < len; i += 4) {
reg = get_unaligned_le32(data + i);
rt2800_register_write(rt2x00dev, FIRMWARE_IMAGE_BASE + i, reg);
}
// 启动固件
rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0x01);
rt2800_register_write(rt2x00dev, H2M_INT_SRC, 0x01);
return 0;
}
六、授时技术与PTP支持
Ralink SoC时间同步支持
MT7621系统时钟支持
// drivers/clocksource/mips-gic-timer.c
static int mt7621_clocksource_init(void)
{
struct device_node *np;
void __iomem *gic_base;
u32 freq;
np = of_find_compatible_node(NULL, NULL, "mtk,mt7621-gic");
if (!np)
return -ENODEV;
gic_base = of_iomap(np, 0);
if (!gic_base)
return -ENOMEM;
// 获取GIC频率
freq = mt7621_get_gic_frequency();
// 注册时钟源
clocksource_mmio_init(gic_base + GIC_COUNTER_LO,
"mt7621-gic", freq, 300, 32,
clocksource_mmio_readl_up);
return 0;
}
网络时间同步
// 在以太网驱动中的时间戳支持
static int mt7620_eth_hwtstamp(struct net_device *dev, struct ifreq *ifr)
{
struct mt7620_eth_priv *priv = netdev_priv(dev);
struct hwtstamp_config cfg;
if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg)))
return -EFAULT;
// 仅支持软件时间戳
if (cfg.tx_type == HWTSTAMP_TX_OFF &&
cfg.rx_filter == HWTSTAMP_FILTER_NONE) {
priv->hwtstamp_config = cfg;
return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ?
-EFAULT : 0;
}
return -ERANGE;
}
七、网络驱动架构软件设计模式演进
第一代:平台设备驱动 (Linux 2.6)
// 早期Ralink平台驱动
static struct platform_driver rt3050_esw_driver = {
.probe = rt3050_esw_probe,
.remove = rt3050_esw_remove,
.driver = {
.name = "rt3050-esw",
.owner = THIS_MODULE,
},
};
static int rt3050_esw_probe(struct platform_device *pdev)
{
struct rt3050_esw *esw;
struct resource *res;
int err;
esw = devm_kzalloc(&pdev->dev, sizeof(*esw), GFP_KERNEL);
if (!esw)
return -ENOMEM;
// 获取资源
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
esw->base = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(esw->base))
return PTR_ERR(esw->base);
// 简单初始化
rt3050_esw_hw_init(esw);
return 0;
}
第二代:设备树支持 (Linux 3.x)
// 设备树支持的驱动
static const struct of_device_id of_mt7620_gsw_match[] = {
{ .compatible = "ralink,mt7620-gsw" },
{ .compatible = "mediatek,mt7620-gsw" },
{},
};
static int mt7620_gsw_probe(struct platform_device *pdev)
{
struct mt7620_gsw *gsw;
struct device_node *np = pdev->dev.of_node;
int ret;
gsw = devm_kzalloc(&pdev->dev, sizeof(*gsw), GFP_KERNEL);
if (!gsw)
return -ENOMEM;
// 从设备树获取资源
gsw->base = of_iomap(np, 0);
if (!gsw->base)
return -ENOMEM;
// 获取系统控制器
gsw->ethsys = syscon_regmap_lookup_by_phandle(np, "ralink,ethsys");
if (IS_ERR(gsw->ethsys))
return PTR_ERR(gsw->ethsys);
// 配置端口
ret = mt7620_gsw_setup_ports(gsw, np);
if (ret)
return ret;
platform_set_drvdata(pdev, gsw);
return 0;
}
第三代:模块化驱动框架 (Linux 4.x+)
// rt2x00模块化框架
static struct rt2x00_ops rt2800pci_ops = {
.name = KBUILD_MODNAME,
.max_sta_intf = 1,
.max_ap_intf = 8,
.eeprom_size = EEPROM_SIZE,
.rf_size = RF_SIZE,
.tx_queues = NUM_TX_QUEUES,
.queue_init = rt2800pci_queue_init,
.lib = &rt2800_rt2x00_ops,
.hw = &rt2800_mac_ops,
.drv = &rt2800_drv_ops,
#ifdef CONFIG_RT2X00_LIB_DEBUGFS
.debugfs = &rt2800_rt2x00debug,
#endif /* CONFIG_RT2X00_LIB_DEBUGFS */
};
// PCIe驱动注册
static struct pci_driver rt2800pci_driver = {
.name = KBUILD_MODNAME,
.id_table = rt2800pci_device_table,
.probe = rt2x00pci_probe,
.remove = rt2x00pci_remove,
#ifdef CONFIG_PM
.suspend = rt2x00pci_suspend,
.resume = rt2x00pci_resume,
#endif /* CONFIG_PM */
};
八、数据上传实时技术演进
实时传输技术发展
1. 传统DMA传输
// Ralink以太网DMA处理
static netdev_tx_t rt3050_esw_start_xmit(struct sk_buff *skb,
struct net_device *dev)
{
struct rt3050_esw *esw = netdev_priv(dev);
struct esw_tx_desc *txd;
dma_addr_t dma_addr;
u32 tx_idx;
// 获取TX描述符
tx_idx = esw->tx_next;
txd = &esw->tx_ring[tx_idx];
// DMA映射
dma_addr = dma_map_single(esw->dev, skb->data, skb->len,
DMA_TO_DEVICE);
// 填充描述符
txd->addr = cpu_to_le32(dma_addr);
txd->len = cpu_to_le16(skb->len);
txd->flags = TXD_FLAG_LAST | TXD_FLAG_CRC;
// 更新指针
esw->tx_next = (tx_idx + 1) % ESW_TX_RING_SIZE;
// 触发传输
rt3050_esw_tx_kick(esw);
return NETDEV_TX_OK;
}
2. 无线传输优化
// rt2x00 AMPDU聚合
static void rt2x00queue_create_tx_descriptor_seq(struct rt2x00_dev *rt2x00dev,
struct sk_buff *skb,
struct txentry_desc *txdesc)
{
struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
// 配置序列号
if (!(tx_info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ))
return;
// 设置序列号
if (ieee80211_is_ctl(hdr->frame_control))
return;
if (ieee80211_has_morefrags(hdr->frame_control)) {
hdr->seq_ctrl |= cpu_to_le16(rt2x00dev->seqno);
} else {
hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
hdr->seq_ctrl |= cpu_to_le16(rt2x00dev->seqno);
rt2x00dev->seqno += 0x10;
}
}
// 硬件队列管理
static void rt2x00usb_kick_queue(struct data_queue *queue)
{
struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev);
struct queue_entry *entry;
struct urb *urb;
int ret;
while (!rt2x00queue_empty(queue)) {
entry = rt2x00queue_get_entry(queue, Q_INDEX);
urb = entry->priv_data;
usb_fill_bulk_urb(urb, usb_dev,
usb_sndbulkpipe(usb_dev, entry->queue->usb_endpoint),
entry->skb->data, entry->skb->len,
rt2x00usb_interrupt_txdone, entry);
ret = usb_submit_urb(urb, GFP_ATOMIC);
if (ret) {
rt2x00_dbg(rt2x00dev, "Failed to submit TX urb: %d\n", ret);
break;
}
rt2x00queue_index_inc(queue, Q_INDEX);
}
}
3. QoS和流量控制
// WMM QoS支持
static void rt2800_config_wmm_ps(struct rt2x00_dev *rt2x00dev,
struct data_queue *queue, enum queue_index index)
{
u32 reg;
switch (index) {
case Q_AC_VO:
reg = 0x00;
break;
case Q_AC_VI:
reg = 0x01;
break;
case Q_AC_BE:
reg = 0x02;
break;
case Q_AC_BK:
reg = 0x03;
break;
default:
return;
}
// 配置队列参数
rt2800_register_write(rt2x00dev, WMM_TXOP0_CFG + (index * 4), reg);
}
// EDCA参数配置
static void rt2800_config_edca(struct rt2x00_dev *rt2x00dev,
struct ieee80211_vif *vif)
{
struct ieee80211_tx_queue_params *params;
u32 reg;
int i;
for (i = 0; i < IEEE80211_NUM_ACS; i++) {
params = &vif->bss_conf.tx_queue_params[i];
reg = (params->aifs << AC_ECW_AC_AIFSN_SHIFT) |
(fls(params->cw_min) << AC_ECW_AC_ECWMIN_SHIFT) |
(fls(params->cw_max) << AC_ECW_AC_ECWMAX_SHIFT) |
(params->txop << AC_TXOP_AC_TXOP_SHIFT);
rt2800_register_write(rt2x00dev, AC_ECW_AC(i), reg);
}
}
性能对比分析
| 技术阶段 | 架构模式 | 延迟水平 | CPU占用 | 适用场景 |
|---|---|---|---|---|
| 传统DMA | 单队列 | 50-100μs | 高 | 家用路由 |
| NAPI优化 | 中断+轮询 | 30-80μs | 中 | SOHO网络 |
| QoS WMM | 优先级队列 | 20-50μs | 中 | 多媒体应用 |
| AMPDU聚合 | 帧聚合 | 10-30μs | 低 | 视频流 |
九、内核源码树形结构分析
Ralink网络驱动源码组织
drivers/net/ethernet/ralink/ ├── esw_rt3050.c # RT3050以太网交换机驱动 ├── gsw_mt7620.c # MT7620千兆交换机驱动 ├── mdio_rt2880.c # MDIO总线驱动 └── soc_mt7620.c # MT7620 SoC以太网驱动 drivers/net/wireless/ralink/ ├── rt2x00/ # rt2x00通用驱动框架 │ ├── rt2x00.h # 核心头文件 │ ├── rt2x00dev.c # 设备管理 │ ├── rt2x00mac.c # MAC80211接口 │ ├── rt2x00config.c # 配置管理 │ ├── rt2x00queue.c # 队列管理 │ ├── rt2x00usb.c # USB支持 │ ├── rt2x00pci.c # PCIe支持 │ ├── rt2400pci.c # RT2400 PCI驱动 │ ├── rt2500pci.c # RT2500 PCI驱动 │ ├── rt2500usb.c # RT2500 USB驱动 │ ├── rt2800pci.c # RT2800 PCIe驱动 │ ├── rt2800usb.c # RT2800 USB驱动 │ └── rt2800lib.c # RT2800共享库 └── rt2x00lib/ # 旧版驱动库
关键函数调用树
// rt2x00驱动初始化 rt2x00pci_probe() → rt2x00lib_probe_dev() → rt2x00dev_alloc() → rt2x00lib_initialize() → ieee80211_register_hw() // 数据路径调用链 rt2x00mac_tx() → rt2x00queue_write_tx_frame() → rt2x00queue_for_each_entry() → rt2x00queue_index_inc() → rt2x00queue_kick_queue() rt2x00usb_interrupt_rxdone() → rt2x00lib_rxdone() → ieee80211_rx() → rt2x00usb_submit_rx_entry() // 配置路径 rt2x00mac_config() → rt2x00lib_config() → rt2x00lib_config_antenna() → rt2x00lib_config_channel()
十、未来发展趋势
技术发展方向
-
WiFi 6支持
-
MediaTek MT7915/MT7921方案
-
802.11ax标准实现
-
-
多千兆交换
-
2.5GbE/5GbE交换芯片
-
10GbE上行支持
-
-
IoT优化
-
低功耗设计
-
小包优化
-
-
智能网络
-
流量分类加速
-
QoS增强
-
-
开源生态
-
OpenWrt深度集成
-
社区驱动开发
-
这个全面的分析展示了Ralink在网络芯片领域从早期的802.11g解决方案到现代集成SoC的技术演进,体现了其在消费级网络设备市场的重要地位。虽然Ralink已被MediaTek收购,但其技术遗产在当前的MTK解决方案中仍然延续。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)