查看drivers/tty/serial/samsung.c文件发现,当传输数据量小于ourport->min_dma_size时,不使用DMA,大于等于min_mda_size时才是使用DMA,因此可以判断时DMA的问题。

static void s3c24xx_serial_start_next_tx(struct s3c24xx_uart_port *ourport)
{
struct uart_port *port = &ourport->port;
struct circ_buf *xmit = &port->state->xmit;
unsigned long count; /* Get data size up to the end of buffer */
count = CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE); if (!count) {
s3c24xx_serial_stop_tx(port);
return;
} if (!ourport->dma || !ourport->dma->tx_chan ||
count < ourport->min_dma_size ||
xmit->tail & (dma_get_cache_alignment() - ))
s3c24xx_serial_start_tx_pio(ourport);
else
s3c24xx_serial_start_tx_dma(ourport, count);
}

解决方法

查阅资料发现【为了强制执行对非安全世界外设和地址访问的限制,Exynos4412配备了“TrustZone保护控制器”和“TrustZone地址空间控制器”。它们控制是否只有安全世界可访问任何给定的外设或者内存地址或安全和非安全世界。另一个需要注意的重要事项,即使CPU在安全模式下运行,PL330 DMA控制器也始终使用非安全模式,因此,如果尝试使用DMA访问在TZPC中设置为“仅安全”的内容,则会出现故障并且DMA传输将失败。所需要的只是将所有内存标记为非安全可读写,并将所有外设标记为非安全可读写即可。】
具体如下:

diff --git a/arch/arm/mach-exynos/dmc_init_exynos4412.c b/arch/arm/mach-exynos/d
index 2b2bc3b..1f756f8
--- a/arch/arm/mach-exynos/dmc_init_exynos4412.c
+++ b/arch/arm/mach-exynos/dmc_init_exynos4412.c
@@ -, +, @@
#include "common_setup.h"
#include "exynos4412_setup.h" +#define NR_TZASC_BANKS 4
++/* Allow non-secure and secure access to all memory */+#define RA0_VAL 0xf0000000
++static void tzasc_init (void) {+ unsigned int start = samsung_get_base_dmc_tzasc();++ unsigned int end = start + (DMC_OFFSET * (NR_TZASC_BANKS - ));+ for(;start <= end; start += DMC_OFFSET) {+ struct exynos4412_tzasc *asc = (struct exynos4412_tzasc *)start;+ writel(RA0_VAL, &asc -> region_attributes_0);+ }+}
#ifdef TINY4412
struct mem_timings mem = {
.direct_cmd_msr = {
@@ -, +, @@ void mem_ctrl_init(int reset)
dmc = (struct exynos4_dmc *)(samsung_get_base_dmc_ctrl()
+DMC_OFFSET);
dmc_init(dmc);
++ tzasc_init();++
}
diff --git a/arch/arm/mach-exynos/include/mach/cpu.h b/arch/arm/mach-exynos/incl
index 1f722df..5800a18
--- a/arch/arm/mach-exynos/include/mach/cpu.h
+++ b/arch/arm/mach-exynos/include/mach/cpu.h
@@ -, +, @@
#define EXYNOS4X12_SYSTIMER_BASE 0x10050000
#define EXYNOS4X12_WATCHDOG_BASE 0x10060000
#define EXYNOS4X12_TZPC_BASE 0x10110000
+
+#define EXYNOS4X12_DMC_TZASC_BASE 0x10700000
+
#define EXYNOS4X12_DMC_CTRL_BASE 0x10600000
#define EXYNOS4X12_GPIO_PART4_BASE 0x106E0000
#define EXYNOS4X12_ACE_SFR_BASE 0x10830000
@@ -, +, @@
#define EXYNOS4X12_AUDIOSS_BASE DEVICE_NOT_AVAILABLE
#define EXYNOS4X12_USB_HOST_XHCI_BASE DEVICE_NOT_AVAILABLE
#define EXYNOS4X12_USB3PHY_BASE DEVICE_NOT_AVAILABLE
-#define EXYNOS4X12_DMC_TZASC_BASE DEVICE_NOT_AVAILABLE
+
+/* #define EXYNOS4X12_DMC_TZASC_BASE DEVICE_NOT_AVAILABLE */ /* EXYNOS5 */
#define EXYNOS5_I2C_SPACING 0x10000
diff --git a/arch/arm/mach-exynos/include/mach/dmc.h b/arch/arm/mach-exynos/incl
index 4990a1a..304e094
--- a/arch/arm/mach-exynos/include/mach/dmc.h
+++ b/arch/arm/mach-exynos/include/mach/dmc.h
@@ -, +, @@ struct exynos5420_phy_control {
unsigned int phy_con42;
}; +struct exynos4412_tzasc {
+ unsigned char res1[0x100];
+ unsigned int region_setup_low_0; //
+ unsigned int region_setup_high_0; //
+ unsigned int region_attributes_0; //
+
+ unsigned char res2;//10c
+ unsigned int region_setup_low_1; //
+ unsigned int region_setup_high_1; //
+ unsigned int region_attributes_1; //
+
+ unsigned char res3;
+ unsigned int region_setup_low_2; //
+ unsigned int region_setup_high_2; //
+ unsigned int region_attributes_2; //
+
+ unsigned char res4;
+ unsigned int region_setup_low_3; //
+ unsigned int region_setup_high_3; //
+ unsigned int region_attributes_3; //
+
+};
+
+
struct exynos5420_tzasc {
unsigned char res1[0xf00];
unsigned int membaseconfig0;
diff --git a/arch/arm/mach-exynos/lowlevel_init.c b/arch/arm/mach-exynos/lowleve
index de85643..4736d60
--- a/arch/arm/mach-exynos/lowlevel_init.c
+++ b/arch/arm/mach-exynos/lowlevel_init.c
@@ -, +, @@ int do_lowlevel_init(void)
#endif
#endif
mem_ctrl_init(actions & DO_MEM_RESET);
-
-#ifndef TINY4412
tzpc_init();
-#endif
} return actions & DO_WAKEUP;
diff --git a/sd_fuse/tiny4412/sd_fusing.sh b/sd_fuse/tiny4412/sd_fusing.sh
index 2658c53..956fa29
--- a/sd_fuse/tiny4412/sd_fusing.sh
+++ b/sd_fuse/tiny4412/sd_fusing.sh
@@ -, +, @@ fi
signed_bl1_position=
bl2_position=
uboot_position=
-tzsw_position=
+tzsw_position= #<TrustZone S/W fusing>
-#echo "---------------------------------------"
-#echo "TrustZone S/W fusing"
-#dd iflag=dsync oflag=dsync if=./E4412_tzsw.bin of=$ seek=$tzsw_position
+echo "---------------------------------------"
+echo "TrustZone S/W fusing"
+dd iflag=dsync oflag=dsync if=./E4412_tzsw.bin of=$ seek=$tzsw_position #<flush to disk>
sync

参考:https://blog.csdn.net/qq_25370227/article/details/84891632

linux-kernel-4.4 移植 (2)解决上部遗留DMA-PL330的问题的更多相关文章

  1. Ubuntu 16.04.2 安装Linux kernel 4.10 内核并解决 VMware 问题

    http://www.linuxidc.com/Linux/2017-03/141456.htm

  2. 移植Linux Kernel SM750 驱动到VxWorks 7

    一.SM750简介 SM750 是SiliconMotion 推出的一款适合嵌入式设备的显卡(Embedded GPU),采用PCIe接口与CPU连接,内部集成16MB DDR SDRAM显存,产品具 ...

  3. Linux下VirtualBox出现kernel driver not installed的解决方法

    今天安装好rhel-server-6.6-i386后,再安装VirtualBox成功,但是再VirtualBox中创建虚拟机的时候出现了“不能为xx虚拟机打开新任务” 并弹出如下的错误信息:

  4. Intel 80x86 Linux Kernel Interrupt(中断)、Interrupt Priority、Interrupt nesting、Prohibit Things Whthin CPU In The Interrupt Off State

    目录 . 引言 . Linux 中断的概念 . 中断处理流程 . Linux 中断相关的源代码分析 . Linux 硬件中断 . Linux 软中断 . 中断优先级 . CPU在关中断状态下编程要注意 ...

  5. 如何进行Linux Kernel 开发

    转自:http://www.cppblog.com/flyonok/archive/2011/04/15/144316.html 如何进行Linux Kernel 开发? (Take 3) 译者序:这 ...

  6. Linux Kernel - Debug Guide (Linux内核调试指南 )

    http://blog.csdn.net/blizmax6/article/details/6747601 linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级 ...

  7. 小白自制Linux开发板 三. Linux内核与文件系统移植

    上一篇完成了uboot的移植,但是想要愉快的在开发板上玩耍还需要移植Linux内核和文件系统. 1.Linux内核 事实上对于F1C100S/F1C200S,Linux官方源码已经对licheepi ...

  8. Linux Kernel代码艺术——系统调用宏定义

    我们习惯在SI(Source Insight)中阅读Linux内核,SI会建立符号表数据库,能非常方便地跳转到变量.宏.函数等的定义处.但在处理系统调用的函数时,却会遇到一些麻烦:我们知道系统调用函数 ...

  9. linux下编译出现空间不足解决办法

    linux下编译出现空间不足解决办法 编译内核出现问题: AS      .tmp_kallsyms1.o .tmp_kallsyms1.S:2: fatal error: when writing ...

随机推荐

  1. numpy学习笔记(四)

    (1)NumPy - 矩阵库 NumPy 包包含一个 Matrix库numpy.matlib.此模块的函数返回矩阵而不是返回ndarray对象. matlib.empty()返回一个新矩阵,而不初始化 ...

  2. HTML5 source标签:媒介元素定义媒介资源

    HTML5 source标签是一种媒介元素(比如 <video> 和 <audio>)来定义媒介资源.<source> 标签允许您规定可替换的视频/音频文件供浏览器 ...

  3. java锁

    ---恢复内容开始--- synchronized 互斥锁 synchronized(this) 当前类的所有synchronized(this) 都被锁了,还有synchronized static ...

  4. python-web自动化-键盘操作

    selenium提供了较为完整的键盘操作引入 from selenium.webdriver.common.keys import Keys使用键盘操作时,需要借助send_keys()来模拟操作.K ...

  5. java 日志脱敏框架 sensitive-新版本0.0.2-深度拷贝,属性为对象和集合的支持

    项目介绍 日志脱敏是常见的安全需求.普通的基于工具类方法的方式,对代码的入侵性太强.编写起来又特别麻烦. 本项目提供基于注解的方式,并且内置了常见的脱敏方式,便于开发. 用户也可以基于自己的实际需要, ...

  6. Jmeter安装使用

    Jmeter的安装与使用 首先,安装Jmeter需要JDK https://www.oracle.com/technetwork/java/javase/downloads/index.html 配置 ...

  7. jQuery中event.target和this的区别

    http://www.cnblogs.com/hhsy/p/5647930.html    该链接有详细讲解

  8. 阿里云从0安装mysql到远程连接

    1.安装mysql数据库. (1)下载mysql源安装包:wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rp ...

  9. Eclipse在开发JavaEE时怎么显示隐藏的WebContent和build文件夹

    在使用eclipse是WebContent和build文件被隐藏起来时解决方法: 1.选择eclipse中的下三角选择Select Working Set: 2.将Java Main Sources选 ...

  10. wdcp lanmp 安装+搭建网站+安全狗安装 详细实用

    先说一下WDCP,其实就是一个集成环境,优点是有后台可视化面板操作,不像一般的linux似的 都要用代码命令! Linux 的PHP 环境一般就是两个搭配 [mysql+Apache+PHP]和[My ...