站在芯片原厂角度移植最新u-boot 2020.07到jz2440开发板(4)(全部驱动使用设备树与dm设备模型)

本文详细介绍U-Boot串口驱动的移植过程,包括驱动代码编写、设备树配置、Kconfig与Makefile修改等内容,适合初学者入门。

8. 编写串口驱动

终于开始进行驱动的移植与编写了!

提到驱动,在最近几年的u-boot版本中,uboot引入了驱动模型(driver model),那具体是什么呢?各位别急,我们之后的每一个驱动都将使用这种驱动模型进行编写,那现在先看比较简单的串口驱动,从实际的驱动中一步步的了解驱动模型dm。

8.1 驱动代码

首先在drivers/serial目录下新建一个文件serial_s3c2440.c,全部内容如下:

/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * (C) Copyright 2020 Asymptote
 */

#include <common.h>
#include <dm.h>
#include <errno.h>
#include <fdtdec.h>
#include <linux/compiler.h>
#include <asm/io.h>
#include <serial.h>

DECLARE_GLOBAL_DATA_PTR;

struct s3c2440_serial {
   
   
	u32 ulcon;
	u32 ucon;
	u32 ufcon;
	u32 umcon;
	u32 utrstat;
	u32 uerstat;
	u32 ufstat;
	u32 umstat;
	u32 utxh;
	u32 urxh;
	u32 ubrdiv;
};

struct s3c2440_serial_priv {
   
   
	struct s3c2440_serial *reg;
};

int s3c2440_serial_setbrg(struct udevice *dev, int baudrate)
{
   
   
	struct s3c2440_serial_priv *priv = dev_get_priv(dev);
	u32 val, uclk;

	/* 使用pclk时钟,大小为50MHz */
	uclk = 50000000;

	val = uclk / baudrate;
	writel(val / 16 - 1, &priv->reg->ubrdiv);

	return 0;
}

static int s3c2440_serial_getc(struct udevice *dev)
{
   
   
	struct s3c2440_serial_priv *priv = dev_get_priv(dev);

	if (!(readl(&priv->reg->utrstat) & (1 << 0)))
		return -EAGAIN;

	return (int)(readb(&priv->reg->urxh) & 0xff);
}

static int s3c2440_serial_putc(struct udevice *dev, const char ch)
{
   
   
	struct s3c2440_serial_priv *priv = dev_get_priv(dev);

	if (!(readl(&priv->reg->utrstat) & (1 << 2)))
		return -EAGAIN;

	writeb(ch, &priv->reg->utxh);

	return 0
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值