tx2内部集成了can控制器,用的是Bosch的芯片。can的驱动在tx2内核中被注册为网络设备也就是socket can,说到这里相信很多人已经猜到了驱动的大致架构,下面记录了我分析驱动的过程。
首先该驱动还是遵循platform架构,所以我们这里就直接进入到probe函数了。
static int mttcan_probe(struct platform_device *pdev)
{
struct net_device *dev;//网络设备,socket can
struct mttcan_priv *priv;//mttcan私有结构体
match = of_match_device(mttcan_of_table, &pdev->dev);//资源匹配
irq = platform_g et_irq(pdev, 0);//获取中断资源
alloc_mttcan_dev();//分配mttcan
{
dev = alloc_candev(sizeof(struct mttcan_priv), MTT_CAN_TX_OBJ_NUM);//分配can
{
//分配一个网络设备,分配大小size,size大小为对齐之后的值
alloc_netdev(size, "can%d", NET_NAME_UNKNOWN, can_setup);
priv = netdev_priv(dev);//使用私有数据
}
priv = netdev_priv(dev);//转为mttcan_priv私有结构体
//时序固定值
priv->can.bittiming_const = &mttcan_normal_bittiming_const;
priv->can.data_bittiming_const = &mttcan_data_bittiming_const;
//设置波特率,模式等函数
priv->can.do_set_bittiming = mttcan_do_set_bittiming;