基于S3C6410处理器的LCD驱动(LINUX系统)
- 格式:pdf
- 大小:688.51 KB
- 文档页数:2
基于Linux嵌入式系统的S3C6410和ADS1298R的SPI接口驱动的实现作者:汤沁徐学军彭地卓李骥来源:《中国新通信》2014年第01期【摘要】本文介绍了高速模数转换芯片ADS1298R与ARM11微控制器S3C6410利用串行外设接口(SPI)进行数据通信的应用方案,给出了两者SPI接口的连接图和Linux操作系统下驱动的具体实现方法,最后编写了应用程序进行测试,论证了该方法的可行性。
ADS1298R和S3C6410基于SPI的串行通信方式为嵌入式高速数据采集系统提供了一个解决方案。
【关键词】 SPI驱动 ADS1298R S3C6410 LinuxSPI总线是一种同步串行外设接口, MCU通过它可以与各种外围设备进行数据通信[7]。
SPI总线只需3~4根数据线和控制线即可扩展具有SPI接口的各种I/O器件,其硬件功能很强,实现软件相当简单[1]。
SPI为全双工通信,显得简单高效,因而A/D转换器与ARM通过SPI接口相结合而组成的基于Linux的数据采集系统显得十分有效。
一、ADS1298R的特性和使用ADS1298R是美国德州仪器公司推出的一款低功率,8通道,同步采样,24位三角积分模数转换器,此产品具有内置的可编程增益放大器(PGA),内部基准和一个板载振荡器[4]。
运行数据速率最高可达32KSPS,时钟频率2.048MHz,具有串行外设接口(SPI),并兼容串口。
其引脚定义如图1所示。
如图2所示为ADS1298R的串行接口时序图,串行时钟为数据的输入输出提供了传输时序。
当一次数据转换完成后,DRDY变低,表示有数据可进行传输,将片选信号CS拉低,串行时钟开始工作,DRDY电平在SCLK的第一个时钟下降沿升高,在SCLK上升沿往外部控制设备传数据,在下降沿从外部控制设备读数据命令。
数据传输阶段CS必须保持低电平,传输一组数据需要216个串行时钟周期。
二、S3C6410概述S3C6410是三星公司推出的一款采用RISC架构的16/32位微控制器,它基于ARM1176JZF-S内核,高效的八级流水线使其贯通率比以前的ARM内核提高了40%[6]。
基于S3C6410的嵌入式LINUX开发时光流逝,转眼间我们即将度过研究生生涯的第一学期。
回首这几个月,很荣幸能与各位同学共同学习,共同进步,尤其是在嵌入式这门课上,我深深感受到了集体的力量。
在这期间,我在大家的身上学到不少的知识,让我对嵌入式系。
统的开发有了更加进一步的认识。
当然,这些还远远不够,我们需要学习的东西还有很多很多。
一.初识S3C6410刚拿到开发板的时候,其实感觉并不陌生,之前有那么一段时间接触过那么一点点。
只是之前接触的,比如51单片机啊stm32啊等等,玩的并不好,然而这些并不能阻挡我学习的热情。
令我感兴趣的是开发板上的主芯片S3C6410,就先简单的浏览了一下三星官方的芯片手册,对芯片有了一个基本的认识:S3C6410是一个16/32位RISC微处理器,旨在提供一个具有成本效益、功耗低,性能高的应用处理器解决方案,像移动电话和一般的应用。
它为2.5G 和 3G 通信服务提供优化的H /W性能, S3C6410采用了64/32位内部总线架构。
该64/32位内部总线结构由AXI、AHB和APB总线组成。
它还包括许多强大的硬件加速器,像视频处理,音频处理,二维图形,显示操作和缩放。
一个集成的多格式编解码器( MFC )支持MPEG4/H.263/H.264编码、译码以及VC1的解码。
这个H/W编码器/解码器支持实时视频会议和NTSC、PAL模式的TV输出。
S3C6410 RISC处理器特性包括:(1)基于CPU的子系统的ARM1176JZF-S具有JA V A加速引擎和16KB/16KB I/D 缓存和16KB/16KB I/D TCM。
(2)在各自地TBD V和TBD V的400/533/667MHz操作频率。
(3)一个8位ITU 601/656相机接口,用于缩放的高达4M像素,固定的16M像素。
(4)多标准编解码器提供的MPEG-4/H.263/H.264编码和解码的高达30帧/s,VC1视频解码、达到30帧/s(5)具有BITBLIT和轮换的2D图形加速。
Linux的LCD驱动源码分析及移植Linux的LCD驱动源码分析及移植(三部曲)第一部分:基于ARM9处理器的linux-2.6.32.2操作系统内核移植手记part5.1(LCD驱动源码分析及移植之platform device)1.与LCD控制器硬件相关的寄存器内容请参照三星S3C2440A技术手册中的第15章。
2. LCD Controller的平台设备定义如下(文件位于linux/arch/arm/plat-s3c24xx/devs.c):1./* LCD Controller */2.3.static struct resource s3c_lcd_resource[] = {4. [0] = {5. .start = S3C24XX_PA_LCD,6. .end = S3C24XX_PA_LCD + S3C24XX_SZ_LCD - 1,7. .flags = IORESOURCE_MEM,8. },9. [1] = {10. .start = IRQ_LCD,11. .end = IRQ_LCD,12. .flags = IORESOURCE_IRQ,13. }14.15.};16.17.static u64 s3c_device_lcd_dmamask = 0xffffffffUL;18.19.struct platform_device s3c_device_lcd = {20. .name = "s3c2410-lcd",21. .id = -1,22. .num_resources = ARRAY_SIZE(s3c_lcd_resource),23. .resource = s3c_lcd_resource,24. .dev = {25. .dma_mask = &s3c_device_lcd_dmamask,26. .coherent_dma_mask = 0xffffffffUL27. }28.};29.30.EXPORT_SYMBOL(s3c_device_lcd);平台设备的结构体定义为s3c_device_lcd,该设备在平台总线中的名字取为s3c2410-lcd,该平台设备申请的两个板级资源为以S3C24XX_PA_LCD为起始的IORESOURCE_MEM资源和一个定义为IRQ_LCD的IORESOURCE_IRQ资源。
Linux串口终端驱动——S3C6410平台1、serial文件夹下Kconfig分析config SERIAL_SAMSUNGtristate "Samsung SoC serial support"depends on ARM && PLAT_S3Cselect SERIAL_COREhelpSupport for the on-chip UARTs on the Samsung S3C24XX series CPUs,为支持三星的片上UARTs控制器providing /dev/ttySAC0, 1 and 2 (note, some machines may notprovide all of these ports, depending on how the serial portpins are configured.config SERIAL_SAMSUNG_UARTS有多少个UART控制器intdepends on SERIAL_SAMSUNGdefault 2 if ARCH_S3C2400default 4 if ARCH_S3C64XX || ARCH_S5P64XX || CPU_S3C2443 || ARCH_S5PC1XX default 3helpSelect the number of available UART ports for the Samsung S3Cserial driverconfig SERIAL_SAMSUNG_DEBUG 调试用bool "Samsung SoC serial debug"depends on SERIAL_SAMSUNG && DEBUG_LLhelpAdd support for debugging the serial driver. Since this isgenerally being used as a console, we use our own outputroutines that go via the low-level debug printascii()function.config SERIAL_SAMSUNG_CONSOLE 用于定义串口为控制台终端bool "Support for console on Samsung SoC serial port"depends on SERIAL_SAMSUNG=yselect SERIAL_CORE_CONSOLEhelpAllow selection of the S3C24XX on-board serial ports for use asan virtual console.Even if you say Y here, the currently visible virtual console(/dev/tty0) will still be used as the system console by default, but you can alter that using a kernel command line option such as"console=ttySACx". (Try "man bootparam" or see the documentation of your boot loader about how to pass options to the kernel atboot time.)config SERIAL_S3C2400 用于S3C2400tristate "Samsung S3C2410 Serial port support"depends on ARM && SERIAL_SAMSUNG && CPU_S3C2400default y if CPU_S3C2400helpSerial port support for the Samsung S3C2400 SoCconfig SERIAL_S3C2410 用于S3C2410tristate "Samsung S3C2410 Serial port support"depends on SERIAL_SAMSUNG && CPU_S3C2410default y if CPU_S3C2410helpSerial port support for the Samsung S3C2410 SoCconfig SERIAL_S3C2412tristate "Samsung S3C2412/S3C2413 Serial port support"depends on SERIAL_SAMSUNG && CPU_S3C2412default y if CPU_S3C2412helpSerial port support for the Samsung S3C2412 and S3C2413 SoCconfig SERIAL_S3C2440tristate "Samsung S3C2440/S3C2442 Serial port support"depends on SERIAL_SAMSUNG && (CPU_S3C2440 || CPU_S3C2442)default y if CPU_S3C2440default y if CPU_S3C2442helpSerial port support for the Samsung S3C2440 and S3C2442 SoCconfig SERIAL_S3C24A0tristate "Samsung S3C24A0 Serial port support"depends on SERIAL_SAMSUNG && CPU_S3C24A0default y if CPU_S3C24A0helpSerial port support for the Samsung S3C24A0 SoCconfig SERIAL_S3C6400 用于 (CPU_S3C6400 || CPU_S3C6410 || CPU_S5P6440) tristate "Samsung S3C6400/S3C6410/S5P6440 Serial port support" depends on SERIAL_SAMSUNG && (CPU_S3C6400 || CPU_S3C6410 || CPU_S5P6440) default yhelpSerial port support for the Samsung S3C6400, S3C6410 and S5P6440 SoCs2、serial文件夹下Makefile文件摘要obj-$(CONFIG_SERIAL_CORE) += serial_core.oobj-$(CONFIG_SERIAL_SAMSUNG) += samsung.oobj-$(CONFIG_SERIAL_S3C2400) += s3c2400.oobj-$(CONFIG_SERIAL_S3C2410) += s3c2410.oobj-$(CONFIG_SERIAL_S3C2412) += s3c2412.oobj-$(CONFIG_SERIAL_S3C2440) += s3c2440.oobj-$(CONFIG_SERIAL_S3C24A0) += s3c24a0.oobj-$(CONFIG_SERIAL_S3C6400) += s3c6400.o3、顶层.config配置文件CONFIG_SERIAL_SAMSUNG=yCONFIG_SERIAL_SAMSUNG_UARTS=4# CONFIG_SERIAL_SAMSUNG_DEBUG is not setCONFIG_SERIAL_SAMSUNG_CONSOLE=yCONFIG_SERIAL_S3C6400=yCONFIG_SERIAL_CORE=yCONFIG_SERIAL_CORE_CONSOLE=y4、从上面这些可知,serial串口驱动主要涉及的文件有(1)、serial_core.c(2)、samsung.c(3)、s3c6400.c1、终端设备在Linux系统中,终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。
Linux字符设备驱动之Tiny6410 LED驱动分析摘要:驱动程序是应用程序和底层硬件之间的桥梁,非常重要。
字符设备是一种可以当做一个字节流来存取的设备,这样的设备只能一个字节一个字节的进行数据传输,这样的驱动常常至少实现open、close、read、和write系统条用,常见的有串口、LED、文本控制台等,字符设备通过文件系统节点来存取,例如/dev/tty1和/dev/lp0.在一个字符设备和一个普通文件之间唯一相关的不同就是,你可以在普通的文件中移来移去,但是大部分字符社诶仅仅是数据通道,只能顺序存取。
重要概念1.用户空间和内核空间一个驱动模块在内核空间运行,而应用程序则是在用户空间运行,这个概念是操作系统的理论基础。
Linux为这两种空间之间的数据传输定义了两个函数,分别为copy_to_user()和copy_from_user(),从字面意思可以知道函数的意义。
比如在编写驱动程序时,很显然驱动程序属于内核空间,会经常使用copy_from_user()函数,从应用程序中获取数据给驱动程序。
2.编译模块使用make xxxx modules 生成xxx.ko模块。
3.加载和卸载模块(驱动)驱动生成的模块需要加载到内核中,加载模块使用insmod指令,如:insmodxxx.ko卸载驱动则用rmmod命令。
4.所需头文件#include <linux/module.h> //包含大量加载模块所需的函数和符号定义#include<linux/init.h> //制定初始化和清理函数许可凭证指令:MODULE_LICENSE(“GPL”);5.初始化和关停初始化指令:static int __initinitialization_function(void){}module_init(initialization_function);初始化函数应声明为静态,因为他们不会再特定文件之外可见,毕竟static的重点应用是“隐藏”。
基于S3C6410和Linux的H.264编码器的实现与优化康维新;郑威威;杨文斌;王伞【摘要】针对目前嵌入式数字视频的实际需求,设计并实现了一种编码效率高、实时性好的嵌入式H.264编码器;该编码器基于S3C6410处理器,采用嵌入式Linux 操作系统,经过对比选择x264编码方案;然后针对嵌入式系统的特点提出了一种新的判定优化效果的方案,并在此基础上进行优化,最后基于优化因子对编码器的性能进行测试;结果表明:优化后帧率提高都在79%以上,并且PSNR值降低不到2.3%,优化因子均值达34.11,可见帧率得到很大提高且PSNR值无明显降低,优化效果良好,实现了实时编码.%Aiming at actual need of present embedded digital video, the paper designes and implements a highly coding efficiency and real ?time embedded H. 264 encoder. The encoder based on S3C6410 processor, uses Embedded Linux operating system , and x264 coding scheme is chosen by comparison. And then according to the characteristics of the embedded system a new method to judge the effect of this optimization is proposed, on this basis the encoder is optimized , in the end the encoder's performance is tested based on the above method. Results showed that after optimization frame rate increase 79% or more and PSNR lower less than 2. 3% , the optimization factors is 34. 11, we can see the frame rates are greatly improved in the same time the PSNR is no obvious change, the effects of the optimization is well, the real time encoding is implemented.【期刊名称】《计算机测量与控制》【年(卷),期】2012(020)008【总页数】3页(P2220-2222)【关键词】H.264编码器;S3C6410;帧率;PSNR【作者】康维新;郑威威;杨文斌;王伞【作者单位】哈尔滨工程大学信息与通信工程学院,哈尔滨 150001;哈尔滨工程大学信息与通信工程学院,哈尔滨 150001;哈尔滨工程大学信息与通信工程学院,哈尔滨 150001;哈尔滨工程大学信息与通信工程学院,哈尔滨 150001【正文语种】中文【中图分类】TP368.20 引言H.264,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG),和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组提出的高度压缩数字视频编解器标准[1]。
基于WINCE6.0+S3C6410的背光驱动1.硬件电路设计基于PWM来调整背光亮度的硬件设计电路如下图所示:图12.基于PWM的控制原理我们使用S3C6410的定时器1来输出PWM信号来调整背光亮度,见PWM定时器部分的描述图23.软件实现3.1定时器1的时钟值的确定1)PCLK本设计中采用ARM主频为533MHZ,HCLK=133MHZ,PCLK=66MHZ,至于这个值的确定见时钟控制器部分。
2)PCLK时钟的第一级分频值见图2的描述,也就是8位Prescaler 0的值的确定,见相关寄存器TCFG0的描述图3代码中的实现如下:图4图4中,我们选择定时器1的Prescaler 0的值为0x3,根据给出的公式:图5这样算出PCLK始终经过第一级分频之后的时钟频率为66MHZ/(3+1)=16.5MHZ。
3)PCLK时钟的第二级分频值见图2的描述,可知每个定制器都有自己的时钟分割器,分频值为1/1、1/2、1/4、1/8、1/16或者是TCLK0作为定时器1的时钟源,图4中,我们选择的是1/8的分频系数,见相关寄存器TCFG1的描述图6结合图5,这样我们就可以算出定时器的时钟频率为16.5 MHZ/8=2.0625MHZ,同时可以算出定时器时钟周期为=0.4848us。
3.2定时器控制寄存器TCON的自动重新装载位和手动更新位下图是TCON寄存器中的相关描述图7在代码中的内容见图4,下面大概描述这两位的作用:1)自动重新装载位当定时器1的下降寄存器的值下降到0的时候,只有使能了自动重新装载位,也即置1,TCNTB1寄存器的值才能自动重新装载到下降寄存器中,从而开始下个周期,才能输出周期新的PWM信号。
2)手动更新位只有手动更新位置1的时候,TCNTB1和TCMPB1的值才会装载到TCNT1和TCMP1,也即下降寄存器和比较寄存器中。
但是在我们开启定时器的时候,需要对手动更新位清零,否则不会有PWM周期信号输出。
Touch-screen Driver Development and CalibrationAlgorithms Based on S3C6410Meini WANG 1, Wei ZHAO 2, Yongqiang ZHANG 21Dalian Ocean University, Dalian, China2Neusoft Institute of Information, Dalia, ChinaAbstract: The touch-screen driver of embedded Linux operating system is developed based on the S3C6410 microprocessor. This paper will use three-point calibration algorithm to solve a touch screen mechanical error and adapt to the development of embedded Linux operating system, in particular, Android, QT and etc. Keywords: S3C6410; Touch-screen Driver; Three-point calibration method基于S3C6410触摸屏驱动开发及校准算法王美妮1,赵伟2,张永强21大连海洋大学,大连,中国,1160232大连东软信息学院,大连,中国,116023摘 要:本文基于S3C6410微处理器,开发了嵌入式Linux 操作系统的触摸屏驱动程序。
并利用三点校准算法,解决了触摸屏机械性误差。
适应于嵌入式Linux 操作系统的开发,特别是Android 、QT 等图形界面平台。
关键词:S3C6410;触摸屏驱动;三点校准法1 引言随着3网融合、嵌入式智能终端等的发展,触摸屏作为终端与用户交互的媒介,广泛应用于自动控制、检测监控、教育、展示和生活等领域。
Tiny6410开发板Linux系统自学笔记一、嵌入式Linux系统自学计划:0、学习嵌入式Linux系统启动、加载的工作原理。
1、搭建针对目标CPU的Linux编译环境。
2、移植、编译针对目标CPU单板的Bootloader。
3、移植、编译针对目标CPU单板的Linux内核。
4、制作用于Linux内核启动的根文件系统。
4、定制、开发针对目标CPU单板的硬件驱动程序。
5、开发基于嵌入式Linux平台的应用程序。
二、参考文档:《ARM学习报告1~3》《嵌入式Linux入门笔记》《嵌入式Linux性能详解》《Tiny6410 Linux开发指南》6410 BootLoader启动过程分析:S3C6410支持从SD卡或Nand FLASH直接启动,但是实际上板子上电后,会首先执行芯片内部iRom中的代码,iROM中的代码会根据GPN[15:13]的管脚来判断从哪个存储设备中读取4KB的启动代码,并放入SteppingStone中运行,这段代码被称为Bootloader1(BL1)。
【因为SteppingStone 是SRAM,所以不需要初始化就可以使用】所以,整个启动过程可以分成BL0, BL1, BL2 三个阶段, 其中BL0是固化在s3c6410内部的iROM中的,1、BL0处理流程如下图所示2、BL1的处理流程对于SD卡, BL1代码位于(totalSector - 18) 的扇区对于SDHC卡,BL1代码位于(totalSector-1042)的扇区对于NANDFLASH,BL1代码位于最前面的4K空间因为最终的系统需要运行在DDR内存中,所以,BL1首先需要执行DDR的初试化,然后再将GPN[15:13]管脚指定的存储设备中bootloader代码(BL1+BL2)拷贝到DDR中,然后重定位到编译器编译时指定的位置,然后跳转。
3、此时,DDR中的BL2就是完成一些复杂的初始化,以及很多辅助调试功能,比如网络命令,usb命令,nand命令等等,最后执行你的bootcmd,将内核加载到指定位置,将bootargs放到指定位置,传递给内核mach_type,bootargs 的存放地址,然后跳转到内核执行,到这里bootloader就完成使命然后消失了。