OK6410A 开发板 (三) 23 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 DM 的一次实例分析 - 串口

发布者:HarmoniousDream最新更新时间:2022-09-21 来源: csdn关键字:OK6410A  开发板  u-boot  镜像  串口 手机看文章 扫描二维码
随时随地手机看文章

串口相关的 UCLASS DRIVER DEVICE


UCLASS


./drivers/serial/serial-uclass.c L504

504 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 L218


static 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,                                                     

};


DEVICE


arch/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_rate

serial_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_dm

serial_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_getc



printf                                              // 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_init


static const struct dm_serial_ops s3c64xx_serial_ops = {                            

    .putc = s3c64xx_serial_putc,                                                    

    .pending = s3c64xx_serial_pending,                                              

    .getc = s3c64xx_serial_getc,                                                    

[1] [2]
关键字:OK6410A  开发板  u-boot  镜像  串口 引用地址:OK6410A 开发板 (三) 23 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 DM 的一次实例分析 - 串口

上一篇:OK6410A 开发板 (三) 24 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 fs-fat
下一篇:OK6410A 开发板 (三) 22 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 malloc

推荐阅读最新更新时间:2024-10-12 16:52

U-Boot添加menu命令的方法及U-Boot命令执行过程
下面以添加menu命令(启动菜单)为例讲解U-Boot添加命令的方法。 (1) 建立common/cmd_menu.c 习惯上通用命令源代码放在common目录下,与开发板专有命令源代码则放在board/ board_dir 目录下,并且习惯以“cmd_ 命令名 .c”为文件名。 (2) 定义“menu”命令 在cmd_menu.c中使用如下的代码定义“menu”命令: _BOOT_CMD( menu, 3, 0, do_menu, menu - display a menu, to select the items to do somethingn , - display a menu, to se
[单片机]
ATmega16L串口通信程序
/************************************************************** 实验名称:串口通信演示实验 晶振:内部 8M 接线方法: 1.PD0接RXD,PD1接TXD 2.打开串口调试助手 使用说明: 1.本程序能够测试串口数据发送与接收。发送采用 查询方式,接收采用中断方式,通信波特率为19200。 2.当上位机软件发送一串数据时,单片机收到后回送相同 的数据。 *****************************************************************/ #include i
[单片机]
u-boot 启动过程 —— 基于S3C2410
本文以流行的Samsung公司的S3C2410,openmoko平台和u-boot-1.3.2(2008.5 发布)为例,介绍如何在ZIX嵌入式开发环境下探索u-boot启动过程。 虽然u-boot已经广泛应用,由于其相对的复杂性使用户在了解其内部 机理和进行u-boot的移植工作时还是会碰到困难。u-boot已有一些分析文档,但多数和真正的代码不能同步或者版本老旧,难以将概念和现实的代码匹配 即硬件板上跑的代码在文档资料中却看不到,更无法紧密的跟踪。本文涉及的代码基于在s3c2410硬件运行的成熟u-boot-1.3.2代码,版本较新,提供的特性非常丰富,而且在 forum.linuxbj.com 可以 自由浏览 和 下载 。此u
[单片机]
STM32F429--I2C通信(读写EEPROM,串口返回测试数据)
一、I2C介绍 I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息,SDA数据线和SCL时钟信号线。    主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。 如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送; 如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送。 二、I2C的通信状态 总线空
[单片机]
STM32F429--I2C通信(读写EEPROM,<font color='red'>串口</font>返回测试数据)
STM32串口第一个字节发不出来解决方法
问题:在STM32中配置好串口之后,发送数据,第一个数据是发不出去的,这时由于Cortex-M3本身的问题 解决办法: 在 USART_ITConfig(DEBUG_USART, USART_IT_RXNE, ENABLE); USART_Cmd(DEBUG_USART, ENABLE); 后面加上下面这一句即可 USART_ClearFlag(DEBUG_USART, USART_FLAG_TC); 如下: 点击(此处)折叠或打开 USART_ITConfig(DEBUG_USART, USART_IT_RXNE, ENABLE);//???????????? USART_Cmd(DEBUG_USART, ENABLE
[单片机]
U-Boot在基于S3C4480开发板上的移植
1 引言 Bootloader代码是器件复位后进入操作系统前执行的一段代码,通过该代码初始化处理器各寄存器和片上外设,建立存储器映射图以及初始化堆栈,从而为操作系统提供基本的运行环境。由于Bootloader与CPU和开发板配置有关,不可能有通用的Bootloader,因此需要根据具体情况进行移植。嵌入式系统U-Boot是当前流行、功能强大的Bootloader。U-Boot用于多种嵌入式CPU的Bootloader 程序,U-Boot支持ARM、PowerPC等多种架构的处理器,也支持Linux、NetBSD和Vx Works等操作系统。这里采用U Boot 的版本为U-boot-1.1.6。 2 U-Boot目录结构
[单片机]
<font color='red'>U-Boot</font>在基于S3C4480<font color='red'>开发板</font>上的移植
stm32开发板开发笔记(4)-启动设置
stm32有个启动引脚Boot0和Boot1,用于设置代码的启动位置 如下图 Boot0位于94脚,是专门的Boot脚,Boot1位于37脚,和PB2复用, Boot1 Boot0 x 0: boot0为0,boot1为任意值,代码从内部程序存储区启动 0 1:代码从系统存储区启动(ISP代码区) 所以将Boot0对地短路,只需改变Boot1就能改变启动方式。 当前主板上MAX232,所以用USB转串口接上主板,配合Flymcu软件,可以读出和擦除当中的信息,但是烧写中间会出错。 FlyMcu(www.mcuisp.com) 可能是由于延长线的问题或USB转串口的问题,并且发现只有波特率为1
[单片机]
stm32<font color='red'>开发板</font>开发笔记(4)-启动设置
如何选择STM32MP1系列核心板和开发板
一款合适的处理器,是每个工程师在开发设计前期调研必须面对的难题。而如何挑选一款符合产品开发的处理器呢?今天我们就以ST公司的STM32MP1系列处理器进行分析比较。 ST公司目前已经发布了两款不同类型的MPU芯片,分别是STM32MP15系列和STM32MP13系列。这两款芯片的特点十分鲜明:STM32MP15采用的是ARM A7 + M4异构CPU,可以实现双系统,支持Linux和RTOS操作系统,并且拥有3D GPU和MIPI显示接口;STM32MP13系列对比STM32MP15系列进行了精简化处理,但功能应用得到提升,处理器主频提高到1GHz,自带的双千兆以太网,双CAN FD功能十分适合应用在工业物联网和汽车通信领域。
[单片机]
如何选择STM32MP1系列核心板和<font color='red'>开发板</font>
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved