rk3308 BSP系统(Linux网关) —— Uboot串口交互终端

了解硬件和更多资料可点击:点击了解

新建一个物联网行业交流学习QQ群,感兴趣可加:928840648

=====CUT=====

硬件连接

我们需要一个USB转串口线来调试,硬件随便都可以,比如:

     

其他转换芯片如CH340,PL2303,FTP232也都是可以的。

板上可以看到如下一个接口:

我们使用串口2也就是UART2来做调试口,将USB转串口线的RXTXGND连接到板子上UART2的TXRXGND。

波特率配置

如果CONFIG_BAUDRATE不是115200,修改为115200,因为不是所有芯片都可以支持高波特率的(15000000):

修改后编译U-Boot并烧录。

调试

创建一个串口连接:

协议选择SERIAL:

注意:端口号对应我们USB转串口的那个端口,波特率要115200;点击“连接”:

最后给板子上电,可以看到串口的UBoot日志输出:

​​​​​​​Driver Model(DM)模型

uboot引入了驱动模型(driver model),这种驱动模型为驱动的定义和访问接口提供了统一的方法;提高了驱动之间的兼容性以及访问的标准型。

uboot的DM主要有四个组成部分:

udevice - 简单就是指设备对象,可以理解为kernel中的device。

driver - udevice的驱动,可以理解为kernel中的device_driver。和底层硬件设备通信,并且为设备提供面向上层的接口。

uclass - 使用相同方式的操作集的device的组。相当于是一种抽象。uclass为那些使用相同接口的设备提供了统一的接口。

uclass_driver - 对应uclass的驱动程序。主要提供uclass操作时,如绑定udevice时的一些操作。

调用关系如下:

DM的模型支持源码在:include/dm:

几个关键数据结构的说明:

uclass id

在uclass-id.h中定义了相关的id,部分列举如下:

比如我们串口用到uclass的ID就是UCLASS_SERIAL。

uclass

同一类设备属于同一个uclass,拥有相同的uclass ID。比如说RTC芯片,市面上RTC芯片很多,由不同的厂家生产,其内存寄存器定义甚至访问接口都不一样,所以RTC的driver肯定是不一样的,但是从功能的角度来说,他们都是用来记录时间的,所他们都属于rtc-class。 uclass从层级结构来讲,起到非常好的承上启下的作用,它既能屏蔽具体设备个体间的差异性,向用户提供统一的接口,又能为同一类的设备定义统一的处理函数,具体的设备驱动只需要实现这些处理函数即可,从而简化的设备驱动的开发。 可以在uclass.h中找到uclass的定义如下:

        从设备的角度来看,同一类的设备(比如RTC)拥有相同的uclass ID,并全部挂在该uclass下;从驱动的角度来看,uclass driver实现通用的处理逻辑。

uclass_driver

同样我们可以在uclass.h中找到struct uclass_driver的定义,这个结构体定义了一组我们访问uclass的接口:

post_bind  // 在udevice被绑定到该uclass之后调用

pre_unbind // 在udevice被解绑出该uclass之前调用

pre_probe  // 在该uclass的一个udevice进行probe之前调用

post_probe // 在该uclass的一个udevice进行probe之后调用

pre_remove // 在该uclass的一个udevice进行remove之前调用

child_post_bind // 在该uclass一个udevice的一个子设备被绑定到该udevice之后调用

child_pre_probe // 在该uclass的一个udevice的一个子设备进行probe之前调用

init     // 安装该uclass的时候调用

destroy  // 销毁该uclass的时候调用

udevice

可以在device.h中找到定义:

const struct driver *driver; // 该udevice对应的driver

const char *name; // 设备名

void *platdata; // 该udevice的平台数据

void *parent_platdata; // 提供给父设备使用的平台数据

void *uclass_platdata; // 提供给所属uclass使用的平台数据

int of_offset; // 该udevice的dtb节点偏移,代表了dtb里面的这个节点node

ulong driver_data; // 驱动数据

struct udevice *parent; // 父设备

void *priv; // 私有数据的指针

struct uclass *uclass; // 所属uclass

void *uclass_priv; // 提供给所属uclass使用的私有数据指针

void *parent_priv; // 提供给其父设备使用的私有数据指针

struct list_head uclass_node; // 用于连接到其所属uclass的链表上

struct list_head child_head; // 链表头,连接其子设备

struct list_head sibling_node; // 用于连接到其父设备的链表上

uint32_t flags; // 标识

driver

同样我们可以在device.h中找到定义:

char *name;    // 驱动名

enum uclass_id id;  // 对应的uclass id

const struct udevice_id *of_match; //用于和device tree里面的设备节点匹配

 (*bind)   // 用于绑定目标设备到该driver中

 (*probe)   // 用于probe目标设备,激活

 (*remove) // 用于remove目标设备。禁用

 (*unbind) // 用于解绑目标设备到该driver中

 (*ofdata_to_platdata) // probe之前,解udevice的dts节点,转化成udevice的数据

 (*child_post_bind) // 如果目标设备的一个子设备被绑定之后,调用

 (*child_pre_probe) // 在目标设备的一个子设备被probe之前,调用

 (*child_post_remove) // 在目标设备的一个子设备被remove之后,调用

int priv_auto_alloc_size; //需要分配多少空间作为其udevice的私有数据

int platdata_auto_alloc_size; //需要分配多少空间作为其udevice的平台数据

int per_child_auto_alloc_size;  //每个子设备需要多少私有数据

int per_child_platdata_auto_alloc_size; //每个子设备需要多少平台数据

const void *ops; // 操作集,提供给uclass用,格式具体由uclass决定

uint32_t flags; // 一些标志位

​​​​​​​串口驱动程序及DTS

U-Boot中的驱动程序目录如下(drivers):

其中serial中存放的是串口相关的驱动源码。

其中ns16550.c为串口驱动程序,采用的是DM的框架,我们可以在源码中查看到相关的定义:

这里的U_BOOT_DRIVER其实是一个宏定义,这段代码其实就是定义一个DM driver,见上节课DM中driver的结构。udevice最终会由一组API来访问这个driver。

设备​​​​​​​树

目录在:arch/arm/dts中:

在rk3308-u-boot.dtsi中,可以看到一个stdout指向uart2,其实就是把串口2作为标准输出:

需要注意的是,serial驱动在加载的时候需要依赖clk驱动,如果在这个时候clk驱动还没有正常加载,需要在对应uart的dts节点中加入clock-frequency属性,同样在该dts文件中可以找到uart2描述:

status可以是okay也可以是disable,表示使能和关闭。

最后我们在u-boot/configs/evb-rk3308_defconfig文件中配置好相关串口做控制台以及对应的波特率就可以了。

 

了解硬件和更多资料可点击:点击了解

新建一个物联网行业交流学习QQ群,感兴趣可加:928840648

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值