博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OK6410A 开发板 (三) 23 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 DM 的一次实例分析 - 串口
阅读量:4285 次
发布时间:2019-05-27

本文共 7028 字,大约阅读时间需要 23 分钟。

串口相关的 UCLASS DRIVER DEVICE

UCLASS./drivers/serial/serial-uclass.c L504504 UCLASS_DRIVER(serial) = {
505 .id = UCLASS_SERIAL, 506 .name = "serial", 507 .flags = DM_UC_FLAG_SEQ_ALIAS, 508 .post_probe = serial_post_probe, 509 .pre_remove = serial_pre_remove, 510 .per_device_auto_alloc_size = sizeof(struct serial_dev_priv), 511 };DRIVER./drivers/serial/s3c64xx_serial.c L218static const struct udevice_id s3c64xx_serial_ids[] = {
{
.compatible = "samsung,ok6410-uart" }, {
} };U_BOOT_DRIVER(serial_s3c64xx) = {
.name = "serial_s3c64xx", .id = UCLASS_SERIAL, .of_match = s3c64xx_serial_ids, .ofdata_to_platdata = s3c64xx_serial_ofdata_to_platdata, .platdata_auto_alloc_size = sizeof(struct s3c64xx_serial_platdata), .probe = s3c64xx_serial_probe, .ops = &s3c64xx_serial_ops, .flags = DM_FLAG_PRE_RELOC, };DEVICEarch/arm/dts/s3c64xx-ok6410a.dts L54 serial0@7F005000 {
compatible = "samsung,ok6410-uart"; reg = <0x7F005000 0x400>; interrupt-parent = <&gic>; interrupts = <0 37 0>; id = <0>; };

初始化过程中的绑定

  • initf_dm 中串口 UCLASS DRIVER DEVICE 的 绑定
initf_dm	dm_init_and_scan		dm_extended_scan_fdt			dm_scan_fdt				dm_scan_fdt_node					for_each_node // node serial0@7F005000						lists_bind_fdt							driver_check_compatible								strcmp(of_match->compatible, compat)							device_bind_with_driver_data								device_bind_common									dev = calloc(1, sizeof(struct udevice));									dev->driver = drv;									dev->uclass = uc;									uclass_bind_device(dev);									if (drv->bind) drv->bind(dev);init_baud_rateserial_init	serial_find_console_or_panic		serial_check_stdout			fdtdec_get_chosen_prop			uclass_get_device_by_of_offset				uclass_get_device_tail					device_probe						device_ofdata_to_platdata							if (drv->ofdata_to_platdata && (CONFIG_IS_ENABLED(OF_PLATDATA) || dev_has_of_node(dev)))								drv->ofdata_to_platdata(dev);						if (drv->probe) drv->probe(dev);/即s3c64xx_serial_probe							s3c64xx_serial_init								uart->UFCON = 0;					serial_setbrg
  • initr_dm 中串口 UCLASS DRIVER DEVICE 的 绑定
initr_dmserial_initialize	serial_init极度类似 initf_dm

消费者

  • UCLASS 提供的 API
消费者调用的 是 UCLASS(./drivers/serial/serial-uclass.c) 中提供的 api为下面 的函数serial_init(void)serial_initialize(void)serial_putc(char ch)serial_puts(const char *str)serial_getc(void)serial_tstc(void)serial_setbrg(void)serial_getconfig(struct udevice *dev, uint *config)serial_setconfig(struct udevice *dev, uint config)serial_getinfo(struct udevice *dev, struct serial_device_info *info)serial_stdio_init(void)
  • 初始化阶段的消费者
board_init_f	serial_init		serial_setbrg	display_options		printf			puts				serial_puts			board_init_r	serial_initialize		serial_init			serial_setbrg	stdio_add_devices		serial_stdio_init	console_init_r		print_pre_console_buffer(flushpoint);			puts				console_puts					stdio_devices[file]->puts(stdio_devices[file], s);/ 即 stdio_serial_puts						serial_puts			run_main_loop	main_loop		cli_loop			...				getcmd_getch					serial_getcprintf                                              // lib/vsprintf.c    puts                                            // common/console.c        fputs                                       // common/console.c            console_puts                	    // common/console.c                stdio_devices[file]->puts(stdio_devices[file], s);/ 即 stdio_serial_puts					serial_puts(s);

DRIVER

  • driver的实现
static const struct udevice_id s3c64xx_serial_ids[] = {
{
.compatible = "samsung,ok6410-uart" }, {
} };s3c64xx_serial_probe s3c64xx_serial_initstatic const struct dm_serial_ops s3c64xx_serial_ops = {
.putc = s3c64xx_serial_putc, .pending = s3c64xx_serial_pending, .getc = s3c64xx_serial_getc, .setbrg = s3c64xx_serial_setbrg, };U_BOOT_DRIVER(serial_s3c64xx) = {
.name = "serial_s3c64xx", .id = UCLASS_SERIAL, .of_match = s3c64xx_serial_ids, .ofdata_to_platdata = s3c64xx_serial_ofdata_to_platdata, .platdata_auto_alloc_size = sizeof(struct s3c64xx_serial_platdata), .probe = s3c64xx_serial_probe, .ops = &s3c64xx_serial_ops, .flags = DM_FLAG_PRE_RELOC, };
  • 与uclass的关系
serial_getc // UCLASS 提供的 API	_serial_getc(gd->cur_serial_dev);		__serial_getc(dev);			struct dm_serial_ops *ops = serial_get_ops(dev);			ops->getc(dev); / 即 s3c64xx_serial_getc				struct s3c64xx_serial_platdata *plat = dev->platdata;				struct s3c64xx_uart *const uart = plat->reg;				while (!(uart->UTRSTAT & 0x1));				return uart->URXH & 0xff;

其他

initf_dm 过程中匹配成功的- found match at 's3c64xx_gpio': 'samsung,s3c6410-pinctrl' matches 'samsung,s3c6410-pinctrl'- found match at 's3c6410_clock': 'samsung,s3c6410-clk' matches 'samsung,s3c6410-clk'- found match at 'serial_s3c64xx': 'samsung,ok6410-uart' matches 'samsung,ok6410-uart'
initr_dm 过程中匹配成功的- found match at 's3c64xx_gpio': 'samsung,s3c6410-pinctrl' matches 'samsung,s3c6410-pinctrl'- found match at 's3c6410_clock': 'samsung,s3c6410-clk' matches 'samsung,s3c6410-clk'- found match at 'serial_s3c64xx': 'samsung,ok6410-uart' matches 'samsung,ok6410-uart'

转载地址:http://rbigi.baihongyu.com/

你可能感兴趣的文章
数据分析-day06-pandas-dataFrame案例分析1(方法二):获取title字段中包含物流运输业名称作为分类,统计各个分类的条数,
查看>>
数据分析-day06-pandas-dataFrame案例分析4:使用PeriodIndex将离散组成pandas的时间序列,然后统计不同时间段,两个地方的pm值走势
查看>>
static synchronized方法和synchronized方法的区别和联系-2(class锁和对象锁,不同锁,混合访问时)
查看>>
spring cloud 自定义ribbon实现负载均衡(二) 解决自定义ribbon和springboot启动类放在同一包下
查看>>
重要重要》》》》》springcloud fegin的基本使用,实现consumer通过fegin访问provider!!!!!
查看>>
spring cloud 远程仓库配置文件(yml或properties)中有server.port参数就无法访问,这是一个大坑吗?
查看>>
es 2.3.3 向es添加数据报NoNodeAvailableException[None of the configured nodes are available
查看>>
springboot 的@RequestBody JSONObject 与@RequestBody Object 的区别
查看>>
springboot pom文件设置<packaging>pom</packaging> 对于application.yml无法加载读取的问题
查看>>
springboot加载resouce下面的静态文件,templates目录的访问,以及经过controller后跳转页面问题
查看>>
shiro的通过md5+salt+hash散列进行注册操作
查看>>
springboot整合applicationContext实现上下文获取实例bean
查看>>
shiro目前问题记录
查看>>
shiro实现本地内存Ehcache实现将菜单权限进行缓存
查看>>
shiro使用redis实现将菜单权限进行缓存
查看>>
cmd窗口下执行jar包 logger.info输出乱码,out语句输出正常解决办法
查看>>
springboot启动初始化实例,后面进行使用
查看>>
shiro实现加载验证码
查看>>
springboot 搭建多模块调用以及打包执行
查看>>
shiro实现不使用密码加密器进行登录
查看>>