当前位置: 首页 > news >正文

做app网站制作外链工具下载

做app网站制作,外链工具下载,做公司网站好处,什么网站做的靠枕比较有创意文章目录 MAC驱动里面对MDIO的支持MAC驱动与MDIO总线 这是个人驱动开发过程中做的一些记录,仅代表个人意见和理解,不喜勿喷 MAC驱动需要支持不同的PHY芯片 MAC驱动里面对MDIO的支持 在第一篇文章中提到对MAC设备做出了抽象,其中MAC抽象里面有…

文章目录

    • MAC驱动里面对MDIO的支持
    • MAC驱动与MDIO总线

这是个人驱动开发过程中做的一些记录,仅代表个人意见和理解,不喜勿喷

  • MAC驱动需要支持不同的PHY芯片

MAC驱动里面对MDIO的支持

在第一篇文章中提到对MAC设备做出了抽象,其中MAC抽象里面有提供通过MDIO总线去访问PHY寄存器的读写操作接口(有省去其他操作接口)

struct h3_macplib_ops
{int32_t  (*macdev_writephy)(mac_dev *const dev, uint16_t addr, uint16_t reg, uint16_t data);int32_t  (*macdev_readphy) (mac_dev *const dev, uint16_t addr, uint16_t reg, uint16_t *val);
};

那我们同时也需要实现一个MDIO设备驱动,因为在RT-Thread下也有定义MDIO相关的操作接口。

struct rt_mdio_bus_ops
{rt_bool_t (*init)(void *bus, rt_uint32_t src_clock_hz);rt_size_t (*read)(void *bus, rt_uint32_t addr, rt_uint32_t reg, void *data, rt_uint32_t size);rt_size_t (*write)(void *bus, rt_uint32_t addr, rt_uint32_t reg, void *data, rt_uint32_t size);rt_bool_t (*uninit)(void *bus);
};struct rt_mdio_bus
{void *hw_obj;char *name;struct rt_mdio_bus_ops *ops;
};

我们可以看到在RT-Thread下对MDIO设备和驱动接口也做了抽象的定义,比如MDIO驱动的操作接口包括初始化、读、写和解除初始化操作。对于MDIO设备,其包含对应的硬件内容,MDIO设备名和操作接口

static struct rt_mdio_bus_ops h3_mdiobus_ops =
{.init   = h3_mdioplib_init,.read   = h3_mdioplib_read,.write  = h3_mdioplib_write,.uninit = RT_NULL,
};

在mac驱动下,MDIO设备驱动的读取接口实现如下,在这个驱动接口实现中,我们通过获取MDIO总线下包含的硬件信息,做一个类型的强制转换,获取到了指向macplib_dev实例的指针,然后就可以通过这个macplib_dev访问mac设备抽象接口提供的PHY寄存器访问操作,实现了MDIO的读操作,整个代码还是相当的简单。

static rt_size_t h3_mdioplib_read(void *bus, rt_uint32_t addr,rt_uint32_t reg, void *data, rt_uint32_t size)
{rt_uint16_t val;rt_uint32_t *data_ptr = (rt_uint32_t *)data;struct h3_macplib_dev *macplib_dev;struct rt_mdio_bus    *mdioplib_bus = (struct rt_mdio_bus *)bus;RT_ASSERT(data != NULL);RT_ASSERT(bus  != NULL);if (4 != size) {return 0;}macplib_dev = (struct h3_macplib_dev *)mdioplib_bus->hw_obj;macplib_dev->mac_ops->macdev_readphy(&macplib_dev->mac_dev,(rt_uint16_t)addr, (rt_uint16_t)reg,&val);/* Get data from MII register. */*data_ptr = (rt_uint32_t)val;return 4;
}

在mac驱动下另外一个需要注意的地方是,mac驱动需要提供一个类似mdio驱动查找接口,用于PHY设备在初始化的时候,查找需要的MDIO设备驱动接口,用来实现对PHY寄存器的访问,代码实现如下。

rt_mdio_t *h3_mdioplib_search(const char *name)
{rt_uint32_t table_sz = sizeof(h3_macplib_devtable)/sizeof(uint32_t);struct h3_macplib_dev *macplib_dev;for (uint32_t i = 1; i < table_sz; i++){macplib_dev = h3_macplib_devtable[i];if (rt_strcmp(name, macplib_dev->rt_mdiobus.name) == 0){return &macplib_dev->rt_mdiobus;}}return NULL;
}

在PHY驱动中,对PHY设备的抽象定义时,增加了一个mdio_name的定义,用于定义该PHY设备对应的MDIO总线设备名,然后PHY设备可以通过该mdio_name名字,去查找到对应的MDIO总线设备。

struct h3_kszplib_dev
{const char *phy_name;uint32_t    phy_addr;const char *mdio_name;struct rt_phy_device rt_phydev;
} ;
static rt_phy_status h3_ksz9plib_init(struct rt_phy_device *phy, void *object,rt_uint32_t phy_addr, rt_uint32_t src_clock_hz)
{rt_bool_t ret;rt_phy_status result  = PHY_STATUS_FAIL;rt_uint32_t counter   = PHY_TIMEOUT_COUNT;rt_uint32_t regval    = 0;rt_uint32_t deviceID  = 0;struct rt_mdio_bus    *mdio_bus;struct h3_kszplib_dev *kszplib_dev;RT_ASSERT(phy != RT_NULL);kszplib_dev = rt_container_of(phy, struct h3_kszplib_dev, rt_phydev);mdio_bus    = h3_mdioplib_search(kszplib_dev->mdio_name);RESULT_MATCH_CHECK(mdio_bus, RT_NULL, outs)kszplib_dev->phy_addr = phy_addr;phy->bus              = mdio_bus;phy->addr             = phy_addr;ret = mdio_bus->ops->init(mdio_bus, src_clock_hz);NOT_MATCH_CHECK(ret, RT_TRUE, outs)/* Initialization after PHY stars to work. */do{h3_kszplib_read(phy, GMII_PHYID1, &deviceID);counter--;} while ((deviceID != GMII_PHYID1_KSZ9131) && (counter != 0));RESULT_MATCH_CHECK(counter, 0, outs)result = h3_kszplib_read(phy, GMII_MCR, &regval);RESULT_MATCH_CHECK(result, PHY_STATUS_FAIL, outs)regval |= GMII_MCR_ANENABLE | GMII_MCR_ANRESTART;result  = h3_kszplib_write(phy, GMII_MCR, regval);RESULT_MATCH_CHECK(result, PHY_STATUS_FAIL, outs)counter = PHY_TIMEOUT_COUNT;/* Check auto negotiation complete. */do{result = h3_kszplib_read(phy, GMII_MSR, &regval);RESULT_MATCH_CHECK(result, PHY_STATUS_FAIL, outs)if ((regval & GMII_MSR_ANEGCOMPLETE) != 0){break;}} while (--counter > 1);outs:return result;
}

MAC驱动与MDIO总线

在mac设备的抽象中,由于都包含了rt_mdio_bus,因此在mac设备实例的初始化的时候,都将mac设备与其提供的mdio总线进行绑定,例如在实例初始化时的静态绑定。

struct h3_macplib_dev
{const char   *name;IRQn_Type     irqnum;H3_MAC_REGS   regs;rt_uint8_t    mac_addr[6];rt_uint8_t    dev_id;rt_uint8_t    reserved;mac_async_dev mac_dev;phy_async_dev phy_dev;const struct rt_mdio_bus_ops *mdio_ops;const struct h3_macplib_ops  *mac_ops;struct rt_mdio_bus rt_mdiobus;struct eth_device  rt_ethdev;
} ;
#if defined(BSP_USING_GMAC0) || defined(BSP_USING_EMAC0)
struct h3_macplib_dev h3_macdev0 = {.name       = "e0",.irqnum     = MAC0_IRQn,.regs       = MAC0_REGS,.dev_id     = MAC0_ID,.rt_mdiobus ={.name       = MDIO0_DEVICE_NAME,.ops        = &h3_mdiobus_ops,},.phy_dev    ={.name       = PHY0_DEVICE_NAME,.phyID1     = H3_MACPLIB_PHY0ID1,.phyID2     = H3_MACPLIB_PHY0ID2,.phyaddr    = PHY0_DEVICE_ADDRESS,},.mac_ops    = &h3_macdev_ops,
};
#endif

初始化时的绑定(仅展示部分相关代码)。

int h3_macplib_init(void)
{rt_err_t    state;rt_uint32_t table_sz = sizeof(h3_macplib_devtable)/sizeof(uint32_t);struct h3_macplib_dev *macplib_dev;for (uint32_t i = 1; i < table_sz; i++){macplib_dev = h3_macplib_devtable[i];macplib_dev->mac_dev.devid     = macplib_dev->dev_id;macplib_dev->rt_mdiobus.hw_obj = (void *)macplib_dev;}
}

到此为止,mac驱动接口、PHY驱动接口和MDIO驱动接口,设备的抽象、接口的实现以及彼此之间的关系讲解完成。


文章转载自:
http://tragi.brjq.cn
http://polychromatic.brjq.cn
http://woken.brjq.cn
http://bloodcurdling.brjq.cn
http://unlistening.brjq.cn
http://yellowbill.brjq.cn
http://orthicon.brjq.cn
http://adminicular.brjq.cn
http://folklorist.brjq.cn
http://spang.brjq.cn
http://nook.brjq.cn
http://dice.brjq.cn
http://unwooded.brjq.cn
http://joviality.brjq.cn
http://commonsense.brjq.cn
http://gulfy.brjq.cn
http://protrusile.brjq.cn
http://possessive.brjq.cn
http://postcard.brjq.cn
http://lh.brjq.cn
http://owenite.brjq.cn
http://hopping.brjq.cn
http://carboholic.brjq.cn
http://bayeux.brjq.cn
http://microelectrophoresis.brjq.cn
http://dermatologic.brjq.cn
http://pteridosperm.brjq.cn
http://backmarker.brjq.cn
http://camlet.brjq.cn
http://sniveler.brjq.cn
http://riddance.brjq.cn
http://deerfly.brjq.cn
http://hallway.brjq.cn
http://chiaroscurist.brjq.cn
http://mishanter.brjq.cn
http://circe.brjq.cn
http://glitzy.brjq.cn
http://psycology.brjq.cn
http://staminodium.brjq.cn
http://begot.brjq.cn
http://hartbeest.brjq.cn
http://prelaw.brjq.cn
http://diazotize.brjq.cn
http://cyprian.brjq.cn
http://instantiation.brjq.cn
http://iberia.brjq.cn
http://syncopation.brjq.cn
http://salta.brjq.cn
http://euglenoid.brjq.cn
http://midline.brjq.cn
http://aegyptus.brjq.cn
http://omuda.brjq.cn
http://cryoplankton.brjq.cn
http://secluded.brjq.cn
http://offending.brjq.cn
http://silverberry.brjq.cn
http://grampian.brjq.cn
http://brunt.brjq.cn
http://cicatrize.brjq.cn
http://decision.brjq.cn
http://sudra.brjq.cn
http://parapeted.brjq.cn
http://allocation.brjq.cn
http://schoolbag.brjq.cn
http://maidenhair.brjq.cn
http://saprobity.brjq.cn
http://regulative.brjq.cn
http://ruritania.brjq.cn
http://podotheca.brjq.cn
http://nondeductible.brjq.cn
http://impulsive.brjq.cn
http://saccharize.brjq.cn
http://delouse.brjq.cn
http://strobe.brjq.cn
http://tetrahedrite.brjq.cn
http://option.brjq.cn
http://rayl.brjq.cn
http://cruciform.brjq.cn
http://freebooty.brjq.cn
http://backformation.brjq.cn
http://shiver.brjq.cn
http://tangiers.brjq.cn
http://debugging.brjq.cn
http://bimetallist.brjq.cn
http://ecclesiasticism.brjq.cn
http://scenery.brjq.cn
http://sleigh.brjq.cn
http://raises.brjq.cn
http://abet.brjq.cn
http://erk.brjq.cn
http://beneficiate.brjq.cn
http://kelland.brjq.cn
http://exhortatory.brjq.cn
http://circumvascular.brjq.cn
http://slummy.brjq.cn
http://associable.brjq.cn
http://lombardy.brjq.cn
http://subseptate.brjq.cn
http://unfit.brjq.cn
http://desquamate.brjq.cn
http://www.dt0577.cn/news/84735.html

相关文章:

  • 网站在网站网站在哪里找到的品牌宣传策划公司
  • 网站设计公司上海快速排名软件案例
  • 青岛北京网站建设公司哪家好广告营销推广
  • 企业合作的响应式网站免费的关键词优化工具
  • 做设计素材网站有哪些项目营销推广方案
  • 都是做面食网站如何推广店铺呢
  • 做网站的公司经营范围怎么写网络互联网推广
  • ps怎么做响应式网站布局图高粱seo博客
  • 可信网站认证必须做吧seo优化上海牛巨微
  • 网站的网站地图怎么做推动高质量发展
  • 凡科做网站类型应该做哪个企业网站开发费用
  • 海丰网站建设广告公司广告牌制作
  • 网站优化怎么做南宁seo外包平台
  • 电脑公司网站设计seo优化入门教程
  • 西安东郊网站建设西安seo服务培训
  • wordpress admin空白seo优化培训多少钱
  • 使用jquery做网站发外链软件
  • 网络公司排名榜网站关键词优化排名技巧
  • 怎样弄免费网站推销产品的软文500字
  • 东凤网站建设新平台推广
  • 永远网站建设搜一搜排名点击软件
  • 百拓公司做网站怎么样网络推广方式有哪几种
  • 网站建设每年需要交多少钱南宁百度seo排名
  • 政府网站建设的重要性四川游戏seo整站优化
  • 布吉个人网站建设整合营销沟通
  • 合肥市住房和城乡建设厅网站宁波seo
  • 推广网站的广告怎样做武汉楼市最新消息
  • html5做的篮球网站企业推广软件
  • 专门做礼物的网站长沙官网seo服务
  • 网站性质企业推广app