at91-看门狗驱动修改指南详解
- 格式:doc
- 大小:45.00 KB
- 文档页数:9
watchdog 解析mg2580看门狗硬件,实现分析1. 看门狗使用的是DW_WDT的看门狗.DW是一个公司的看门狗芯片.此驱动程序实现两个看门狗操作:硬件和软件。
硬件看门狗监控系统在下列情况下将reset.它已经停止响应,或软件看门狗有问题.软件看门狗由用户空间应用程序处理应用程序申请挂起处理.2.如何使用看门狗?(1). 打开/dev/watchdog.(2). 使用IOCTL接口来设置超时。
(3). 指定所需的设置。
(4). 通过IOCTL接口喂狗。
应用程序必须这样做是为了避免触发看门狗。
(5). 关闭/dev/watchdog。
如果软件看门狗关闭,驱动将试图杀死进程的看门狗定时器。
如果驱动程序无法杀死该进程系统将重置。
注意!应特别注意使用时使用,因为该软件看门狗明显的影响重置系统。
3. 加载看门狗看门狗驱动默认加载,如果没有加载,可以手动加载,默认超时时间是17s,两种方法可以改变,一种为:(1). modparam dw_wdt hw_default_heartbeat=XX(XX 为1-17s)(2). echo XX > /proc/driver/watchdog/expires看硬件看门狗超时时间.cat /proc/driver/watchdog/expires看软件和硬件看门狗信息:cat /proc/driver/watchdog/status这个前一个命令: 是硬件看门狗启动,超时为17s,没有启动软件看门狗.后一个命令: 是硬件看门狗启动,超时为17s,启动软件看门狗,进程为1161,超时为10s.系统超时总时间为: 10< watch timer < 10+17 s3. 原理:1.软件看门狗通过定时器实现:当定时器超时,运行,定时器处理函数, 重启或kill 进程.2.硬件的喂狗:写寄存器重新启动WDT计数器。
作为安全措施,值0x76必须写入。
重新启动并且清除WDT的中断。
AT91RM9200-DVK2.3开发板软硬件配置清单1.硬件配置开发板照片1.1. 核心板序号项目配置说明1 处理器: AT91RM9200工业级2片2 内存 64M HY5616203 NOR FLASH 4MB AMD29LV320D B4 扩展总线80 x 2 引出ARM绝大部分信号1.2. 主板序号项目配置说明1.调试接口 20芯JTAG 符合ARM公司的标准定义2. USB主1个支持U盘,键盘等。
12Mb/s3. USB从1个12Mb/s4. CAN 1个 CAN2.0A/B接口。
5.红外1个6. RS485 1个7. RS232 3个1个9针,2个3针8. SD卡1个支持<1G SD卡。
9. LCM接口1个 LCM240X128 支持青云的LCM2401281单色液晶模块。
(液晶单独选配)10.矩阵键盘 8X8 支持1-64个键。
11.实时钟 DS1302外扩实时钟带后备电池。
12.网络1个10/100M DM916113. NAND-FLASH 64M K9f1208支持YAFFS文件系统。
14.扩展总线接口 40针扩展接口可用于连接用户自己开发的接口应用板。
15.电源 +5V电源输入2.软件配置序号项目配置说明1.引导程序 U-BOOT-1.1.2开放源代码。
2.操作系统 ARM-LINUX内核源代码3.开发环境。
ARM-LINUX-2.95.3编译器ARM-LINUX-3.4.1编译器LCD字符和图形显示的示例。
演示在240X128单色液晶上显示英文字符数字和简单图形符号。
键盘的读取演示对键盘按键值的读取实时时钟读写演示如何读取和设置系统实时钟。
TCP/UDP协议的SOCKET 编程演示客户-服务器通讯ARM和PC通讯4.LINUX应用开发演示源代码RS232接口的TTY串口通信演示开发板与PC机之间的RS232双向通讯。
红外线IrDA 的通信 RS485接口通信USB 接口的U 盘挂装和读写 硬件看门狗应用演示源代码pthread 多线程编程 学习多任务编程 5. CAN 总线通讯CAN MCP2510(选购) LCD LCM 单色屏(选购) MTD NAND -FLASH NET以太网RTC DS1302及9200内部RTC IO IO 口读写SERIAL 串口及485 USBWATCHDOG 看门狗SD 支持512MB SD 卡(选购)6. 板子上所有硬件的驱动程序源代码。
SAM9260V1 Linux配置编译手册Rev. 1.0Release: 2008-08-26联系信息更多信息请访问:Revision history Rev DateDescription1.0 20080826 Initial version目录第一章引言 (5)1.1概述 (5)1.2必要准备 (5)第二章编译L INUX内核 (6)第三章制作YAFFS文件系统映像 (7)第四章内核驱动配置 (8)4.1串口 (8)4.2实时时钟(RTC) (9)4.3看门狗 (10)4.4 I2C总线 (12)4.5 AD转换器(ADC) (13)4.6 I2C EEPROM (14)4.7 GPIO接口 (15)4.8 SPI总线 (16)4.9 CAN总线 (17)4.10网络 (18)4.11 MMC/SD卡 (21)4.12 USB接口 (22)4.13 NAND Flash上使用YAFFS (25)PrefaceSAM9260V1是一款高度集成的工业控制单板机,采用ATMEL公司的AT91SAM9260控制器,并支持多种存储模式和提供多种通信接口,可以直接嵌入到客户系统内部,作为主控板使用。
SAM9260V1提供Linux2.6.19操作系统及完善的底层驱动程序,客户可直接基于驱动进行上层应用开发工作。
SAM9260V1 Linux配置编译手册主要介绍用户在开发驱动的过程中对linux内核进行编译配置的方法,用户可参考此文档按照实际需求对linux进行定制,及制作相应的文件系统。
第一章引言1.1概述本文档主要介绍用户在开发驱动的过程中对linux内核进行编译配置的方法,用户可参考此文档按照实际需求对linux进行定制,及制作相应的文件系统。
1.2必要准备首先在解压光盘中所提供的源码包,进入光盘路径,运行解压指令,进行如下解压缩指令(注:本手册须在PC机linux系统上操作,且需要用root用户权限进行解压缩)[root@localhost]$ tar –jxvf sam9260V1.tar.bz2 –C /解压缩后,会在opt下生成两个文件夹,各个文件夹内容如下:/opt/timesys/toolchains/armv5l-linux/ 为交叉编译工具文件夹/opt/sam9260V1/linux-2.6.19/ linux内核文件夹/opt/sam9260V1/rootfs 文件系统文件夹/opt/sam9260V1/tools/mkyaffsimage yaffs制作工具/opt/sam9260V1/test_code/ 测试代码文件夹如果用户需要对相应的文件进行操作,用户可进入相应的文件夹中。
AT91SAM9R64 USB Certification1.IntroductionThis Application Note describes the USB certification process for the AT91SAM9R64 ARM® Thumb®-based microcontroller that contains a USB V2.0 High Speed Device. It describes the full USB peripheral environment required for USB-IF compliance.The following table gives the references of applicable documents:Document Reference DenominationAtmel lit° 6289A T91SAM9R64 and RL64 Datasheet and Summary DatasheetAtmel lit° 6193 Mass Storage and File System Demo for A T91SAM7S_EK Development Board User GuideAtmel softpack A T91 Software packageusb_20.pdf Universal Serial Bus Revision 2.0 Specification (from /developers/docs)usb-msc-overview-1.3b.pdf Universal Serial Bus - Mass Storage Class Specific Overview (from /developers/devclass_docs)usbmassbulk_10.pdf Universal Serial Bus - Mass Storage Bulk-Only T ransport (from /developers/devclass_docs)compliance tools USB-IF Compliance Program (from /developers/compliance)compchkperisil080205.pdf USB Compliance Checklist, Peripheral Silicon (Excluding Hub Silicon) (from /developers/compliance/checklist)compchkperi080205.pdf USB Compliance Checklist, Peripherals (Excluding Hubs) (from /developers/compliance/checklist)26487A–ATARM–30-Jul-09Application NoteB CertificationInformation used in this chapter is available on the USB web site/home2.1The Purpose of USB CertificationThe Universal Serial Bus (USB) is a huge success! This presents a great market opportunity for USB vendors. In order to realize this opportunity, USB products must continue to enhance the consumer’s experience through high quality and ease of use. That is why USB Implementers Forum, Inc. introduced a trademark-protected logo for use with qualified products. To qualify for the right to display the certified USB logo in conjunction with a product, the product must pass USB-IF compliance testing for product quality.Figure B HighSpeed LogoEach type of USB product requires specific testing to get on the USB Integrator’s List. End user products (peripherals) have to fill the USB Compliance Checklist. For instance, peripherals which require identification of the receptacles, cable assembly or, if the cable is captive, the A connector, and manufacturer and model identifier of the USB Silicon used in the peripheral.If the silicon used in the peripheral is not listed on the USB Integrator’s List, then a Peripheral Silicon Checklist covering this peripheral’s USB silicon must be provided.Atmel has already submitted the AT91SAM9R64 and this product is now referenced in the USB integrator list:AT91SAM9R64Revision GTID 40000827To pass the peripheral silicon testing, it was necessary for Atmel to construct a final product based on the AT91SAM9R64 and test that product as anyone using the AT91SAM9R64 would do. The final product application is a mass-storage based application using the AT91SAM9R-VBboard.36487A–ATARM–30-Jul-09Application Note2.2Where to Apply for USB CertificationThe USB-IF logos may be used only in conjunction with products that have passed USB-IF com-pliance testing and are currently on the USB Integrator’s List. This requires that the company be assigned a USB vendor ID number. Atmel’s USB vendor ID is 03EBh.There is a logo administration fee of US $2000 for non-USB-IF members, to be submitted with the signed agreement and a Vendor ID form, that you can get from the “Getting a Vendor ID”page:/developers/vendor/VID_Only_Form_withCCAuth_02042009.pdfif your company does not already have a vendor ID. The fee is waived for USB-IF members.Registration to the USB-IF community can be done on-line.There are two mechanisms for testing products to get them on the USB Integrator’s List:•you can participate in the USB-IF Sponsored Compliance Workshops, or•contact one of the Independent Test Labs.A complete list of test labs and contact information is available at:/developers/complianceTo qualify the AT91SAM9R64 product, Atmel has been working with the following lab:Testronic Laboratories/ PMTCJohan CraeybeckxWetenschapspark 7B-3590 DiepenbeekBelgiumTel: +32 11 30 36 53Fax: +32 11 30 36 90Email:**********************************URL: Companies should contact the lab of their choice directly for pricing and scheduling. To submit a testing request to the lab of choice, follow the instructions below:•Go to the “Compliance Member Tools” section of the Web site:/kcompliance/membersType in your User name and Password.•Click on “Register a Product for testing”•Select the type of product to submit for testing, the test lab of choice and enter the product information completely. The product submission will be in the “New” state. The selected test lab will receive email notification of the request. Once the test lab reviews and accepts the testing request, the product’s status will be “Accepted for T esting”.46487A–ATARM–30-Jul-09Application Note2.3Peripheral Test RequirementsThe following must be successfully completed for Peripherals:•Electrical Tests (full speed and high speed)•Interoperability Tests (full speed and high speed)•Functional Tests (full speed and high speed)•Submission of Completed Peripheral ChecklistAdditional information is available at /developers/docs:•for full speed, select the USB-IF Compliance T est Procedure•for high speed, select the High-speed Electrical Test Procedure corresponding to the equipment to test56487A–ATARM–30-Jul-09Application Note3.AT91SAM9R64 Test Product Description3.1System DescriptionTo pass the peripheral silicon testing, Atmel built a final product based on the AT91SAM9R64.The final product application is a mass-storage based application using the AT91SAM9R-VB board.Once the AT91SAM9R-VB board is connected to the host PC, a new disk drive appears on screen. The SDRAM of the AT91SAM9R-VB board appears as a new flash drive. Through Win-dows ®OS, applications can perform file transfer with the target external flash. As the peripheral enumerates as a standard mass-storage device (please refer to the USB Mass-storage class specification), this application does not require any Windows 2000 drivers.The mass-storage source code is freely delivered by Atmel in the Software Package.The AT91SAM9R-VB board has not been modified.3.2Main ConstraintsThe tested peripheral should match all requirements specified in the USB Revision 2.0 Specifi-cation. Only a few constraints with immediate consequences on application programming and board design are highlighted here.3.2.1Clock ConstraintsThe high-speed data rate (T HSDRA T ) is nominally 480.00 Mb/s, with a required bit rate accuracy of ±500 ppm. For high-speed capability, the required data-rate accuracy when transmitting at any speed is ±0.05% (500 ppm). Refer to the USB Rev2.0 Specification, chapter “Data Signaling Rate”.The application firmware must configure clocks and PLL in order to match these requirements.3.2.2Timing ConstraintsAfter connecting a peripheral to a host, the device has at least 100 ms after the detection of the pull-up by the host to configure and be able to answer host requests.A peripheral begins the transition to the suspend state after it observes a constant Idle state on its upstream facing bus lines for more than 3.0 ms. The device must actually be suspended,drawing only suspend current from the bus after no more than (T 2SUSP ) 10 ms of bus inactivity on all its ports. Thus the application firmware has 7 ms to reduce power consumption of the board.Refer the USB Rev2.0 Specification, chapter “Suspending”.The host must provide a 10 ms resume recovery time (T RSMRCY ) during which it will not attempt to access any device connected to the affected (just-activated) bus segment. During this time the application firmware must restore clocks and software context.3.3AT91SAM9R-VB Certified Board Description 3.3.1Hardware DescriptionNo change has been made on this board.3.3.2Software DescriptionThis is the usb-device-massstorage-project of the Software Package, freely delivery by ATMEL.66487A–ATARM–30-Jul-09Application Note4.AppendixThe pages shown in the Appendix are scanned copies of the original documents as listed B Compliance Checklist, Peripheral Silicon .USB Compliance Checklist, PeripheralsUSB Certification Report for the AT91SAM9R64 Rev G76487A–ATARM–30-Jul-09Application NoteRevision History Doc. RevComments Change Request Ref.6487A First issueHeadquarters InternationalAtmel Corporation 2325 Orchard Parkway San Jose, CA 95131 USATel: 1(408) 441-0311 Fax: 1(408) 487-2600Atmel AsiaUnit 1-5 & 16, 19/FBEA Tower, Millennium City 5418 Kwun Tong RoadKwun Tong, KowloonHong KongTel: (852) 2245-6100Fax: (852) 2722-1369Atmel EuropeLe Krebs8, Rue Jean-Pierre TimbaudBP 30978054 Saint-Quentin-en-Yvelines CedexFranceTel: (33) 1-30-60-70-00Fax: (33) 1-30-60-71-11Atmel Japan9F, Tonetsu Shinkawa Bldg.1-24-8 ShinkawaChuo-ku, Tokyo 104-0033JapanTel: (81) 3-3523-3551Fax: (81) 3-3523-7581Product ContactWeb Site/AT91SAMTechnical SupportAT91SAM SupportAtmel techincal supportSales Contacts/contacts/Literature Requests/literatureDisclaimer: The information in this document is provided in connection with Atmel products. No license, express or implied, by estoppel or otherwise,to any intellectual property right is granted by this document or in connection with the sale of Atmel products. EXCEPT AS SET FORTH IN ATMEL’S TERMS AND CONDI-TIONS OF SALE LOCATED ON ATMEL’S WEB SITE, ATMEL ASSUMES NO LIABILITY WHATSOEVER AND DISCLAIMS ANY EXPRESS, IMPLIED OR STATUTORY WARRANTY RELATING TO ITS PRODUCTS INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, PUNITIVE, SPECIAL OR INCIDEN-TAL DAMAGES (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION, OR LOSS OF INFORMATION) ARISING OUT OF THE USE OR INABILITY TO USE THIS DOCUMENT, EVEN IF ATMEL HAS BEEN ADVISED OF THE P OSSIBILITY OF SUCH DAMAGES. Atmel makes no representations or warranties with respect to the accuracy or completeness of the contents of this document and reserves the right to make changes to specifications and product descriptions at any time without notice. Atmel does not make any commitment to update the information contained herein. Unless specifically provided otherwise, Atmel products are not suitable for, and shall not be used in, automotive applications. Atmel’s products are not intended, authorized, or warranted for use as components in applications intended to support or sustain life.© 2009 Atmel Corporation. All rights reserved. Atmel®, Atmel logo and combinations thereof, and others are registered trademarks or trade-marks of Atmel Corporation or its subsidiaries. Other terms and product names may be trademarks of others.6487A–ATARM–30-Jul-09。
附录一、驱动程序:at91sam9g20核心板的看门狗驱动看门狗的驱动一般来说比较简单,只要做寄存器的设置实现开启、关闭、喂狗功能。
本项目中我们使用的是at91sam920处理器,带有看门狗定时器。
这个看门狗的驱动却比较复杂,应用层想用它的话,将涉及到boot引导设置,uboot配置及驱动,改写驱动程序。
下面将逐步说明。
1、boot引导(bootstrap-v1.15)由于该看门狗的MR寄存器只能写一次(Only a processor reset resets it.),而默认情况下看门狗在boot引导程序中被关闭了,所以在boot引导程序中我们要开启看门狗。
在board/at91sam9g20ek/at91sam9g20ek.c文件的硬件初始化函数hw_init中注释掉下面的配置即可开启看门狗:/* writel(AT91C_WDTC_WDDIS, AT91C_BASE_WDTC + WDTC_WDMR); */为了功能设置:我们配置如下:writel(AT91C_WDTC_WDV | AT91C_WDTC_WDD | AT91C_WDTC_WDRSTEN | AT91C_WDTC_WDFIEN, AT91C_BASE_WDTC + WDTC_WDMR);2、uboot配置及驱动(uboot-v1.3.4):默认情况下,看门狗在uboot中没有配置,需要手动添加配置,在文件include/configs/at91sam9g20ek.h中添加如下配置#define CONFIG_HW_WA TCHDOG 1#define CONFIG_AT91SAM9_WA TCHDOG 1此时编译uboot,会提示你找不到hw_watchdog_reset复位函数,这是因为虽然我们配置看门狗,但看门狗的uboot驱动并不存在,下面就来添加uboot下的看门狗驱动。
1)添加include/asm-arm/arch-at91sam9/at91_wdt.h,内容如下/** [origin: Linux kernel arch/arm/mach-at91/include/mach/at91_wdt.h]** Copyright (C) 2008 Jean-Christophe PLAGNIOL-VILLARD <plagnioj at >* Copyright (C) 2007 Andrew Victor* Copyright (C) 2007 Atmel Corporation.** Watchdog Timer (WDT) - System peripherals regsters.* Based on AT91SAM9261 datasheet revision D.** This program is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Foundation; either version 2 of the License, or* (at your option) any later version.*/#ifndef AT91_WDT_H#define AT91_WDT_H#define AT91_WDT_CR (AT91_WDT + 0x00) /* Watchdog Control Register */ #define AT91_WDT_WDRSTT (1<<0) /* Restart */#define AT91_WDT_KEY (0xa5 << 24) /* KEY Password */#define AT91_WDT_MR (AT91_WDT + 0x04) /* Watchdog Mode Register */ #define AT91_WDT_WDV (0xfff << 0) /* Counter Value */#define AT91_WDT_WDFIEN (1 << 12) /* Fault Interrupt Enable */#define AT91_WDT_WDRSTEN (1 << 13) /* Reset Processor */#define AT91_WDT_WDRPROC (1 << 14) /* Timer Restart */#define AT91_WDT_WDDIS (1<< 15) /* Watchdog Disable */#define AT91_WDT_WDD (0xfff << 16) /* Delta Value */#define AT91_WDT_WDDBGHLT (1 << 28) /* Debug Halt */#define AT91_WDT_WDIDLEHLT (1 << 29) /* Idle Halt */#define AT91_WDT_SR (AT91_WDT + 0x08) /* Watchdog Status Register */#define AT91_WDT_WDUNF (1 << 0) /* Watchdog Underflow */#define AT91_WDT_WDERR (1 << 1) /* Watchdog Error */#endif2)添加drivers/watchdog/at91sam9_wdt.c,内容如下/** [origin: Linux kernel drivers/watchdog/at91sam9_wdt.c]** Watchdog driver for Atmel AT91SAM9x processors.** Copyright (C) 2008 Jean-Christophe PLAGNIOL-VILLARD <plagnioj at > * Copyright (C) 2008 Renaud CERRATO r.cerrato at til-technologies.fr** This program is free software; you can redistribute it and/or* modify it under the terms of the GNU General Public License* as published by the Free Software Foundation; either version* 2 of the License, or (at your option) any later version.*//** The Watchdog Timer Mode Register can be only written to once. If the * timeout need to be set from U-Boot, be sure that the bootstrap doesn't * write to this register. Inform Linux to it too*/#include <common.h>#include <watchdog.h>#include <asm/arch/hardware.h>#include <asm/arch/io.h>#include <asm/arch/at91_wdt.h>//#include <asm-arm/arch-at91sam9/at91_wdt.h>#define ms_to_ticks(t) (((t << 8) / 1000) - 1)#define ticks_to_ms(t) (((t + 1) * 1000) >> 8)/* Hardware timeout in seconds */#define WDT_HW_TIMEOUT 2/** Set the watchdog time interval in 1/256Hz (write-once)* Counter is 12 bit.*/static int at91_wdt_settimeout(unsigned int timeout){unsigned int reg;unsigned int mr;/* Check if disabled */mr = at91_sys_read(AT91_WDT_MR);if (mr & AT91_WDT_WDDIS){printf("sorry, watchdog is disabled/n");return -1;}/** All counting occurs at SLOW_CLOCK / 128 = 256 Hz** Since WDV is a 12-bit counter, the maximum period is* 4096 / 256 = 16 seconds.*/reg = AT91_WDT_WDRSTEN /* causes watchdog reset *//* | AT91_WDT_WDRPROC causes processor reset only */| AT91_WDT_WDDBGHLT /* disabled in debug mode */| AT91_WDT_WDD /* restart at any time */| (timeout & AT91_WDT_WDV); /* timer value */at91_sys_write(AT91_WDT_MR, reg);return 0;}void hw_watchdog_reset(void){at91_sys_write(AT91_WDT_CR,A T91_WDT_KEY | AT91_WDT_WDRSTT); }void hw_watchdog_init(void){/* 16 seconds timer, resets enabled */at91_wdt_settimeout(ms_to_ticks(WDT_HW_TIMEOUT * 1000));}3)添加drivers/watchdog/Makefile## (C) Copyright 2008# Wolfgang Denk, DENX Software Engineering, wd at denx.de.## See file CREDITS for list of people who contributed to this# project.## This program is free software; you can redistribute it and/or# modify it under the terms of the GNU General Public License as# published by the Free Software Foundation; either version 2 of# the License, or (at your option) any later version.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY W ARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details.## You should have received a copy of the GNU General Public License# along with this program; if not, write to the Free Software# Foundation, Inc., 59 Temple Place, Suite 330, Boston,# MA 02111-1307 USA#include $(TOPDIR)/config.mkLIB := $(obj)libwatchdog.aCOBJS-$(CONFIG_AT91SAM9_WATCHDOG) += at91sam9_wdt.oCOBJS := $(COBJS-y)SRCS := $(COBJS:.o=.c)OBJS := $(addprefix $(obj),$(COBJS))all: $(LIB)$(LIB): $(obj).depend $(OBJS)$(AR) $(ARFLAGS) $@ $(OBJS)######################################################################### # defines $(obj).depend targetinclude $(SRCTREE)/rules.mksinclude $(obj).depend######################################################################### 4)修改uboot的Makefile,主要是把watchdog编辑到工程里修改1:LIBS += drivers/video/libvideo.a+LIBS += drivers/watchdog/libwatchdog.a(添加)LIBS += common/libcommon.a修改2:TAG_SUBDIRS += drivers/usbTAG_SUBDIRS += drivers/video+TAG_SUBDIRS += drivers/watchdog (添加)5)另外,为了在其它地方调用WA TCHDOG_RESET函数,可以将watchdog.h添加包含到include/common.h文件中:#if defined (CONFIG_HW_WATCHDOG)#include <watchdog.h>#endif6)修改串口驱动drivers/serial/atmel_usart.c,主要是在串口读的时候复位看门狗,防止系统重启int serial_getc(void){- while (!(usart3_readl(CSR) & USART3_BIT(RXRDY))) ; (删除)+ while (!(usart3_readl(CSR) & USART3_BIT(RXRDY))) (添加)+ WATCHDOG_RESET(); (添加)return usart3_readl(RHR);}3、改写驱动程序(linux2.6.30内核)1、配置内核在默认情况,系统并不加载看门狗驱动,需要配置内核:make menuconfigDevice drivers-->Watchdog Timer Support-->AT91SAM9X / A T91CAP9 watchdog 然后编译,重新烧写uImage文件到板子上。
AT91SAM9260数据手册1、描述AT91SAM9260是以ARM926EJ-S处理器为核心的片上系统,它扩展了快速ROM、RAM 以及大量的外设。
AT91SAM9260集成了以太网的MAC、一个USB设备端口、一个USB主机控制器。
此外,它还集成了几种标准的外设,如USART、SPI、TWI、TimerCounter、同步串行控制器、ADC和多媒体卡接口。
AT91SAM9260采用了6层总线矩阵构架,大大增强了6条32位总线的内部带宽。
同时它的外部总线接口能支持大量的存储设备。
2、方框图该方框图显示了217脚LFBGA封装的所有特征,有些功能在208脚PQFP封装里面是没有的。
3、信号描述4、封装与引脚排列5、电源事宜5.1 电源AT91SAM9260有如下几种类型的电源管脚:●VDDCORE 管脚:内核电源,包括处理器、内嵌存储器和外设,电压范围从1.65~1.95,额定电压为1.8V●VDDIOM 管脚:外部总线接口I/O口电源;电压范围从1.65V~1.95V(1.8V);或3.0~3.6(3.3),具体的电压范围可有软件确定●VDDIOP0 管脚:外设I/O口线和USB收发器电压;电压范围3.0~3.6(3.0/3.3)●VDDIOP1 管脚:外设I/O口线,包括图像传感器接口;电压范围1.65~3.6(1.8/2.5/3/3.3)●VDDBU 管脚:慢速时钟振荡器和部分系统控制器电源;电压范围 1.65V~1.95V(1.8V)●VDDPLL 管脚:主时钟和锁相环部件电源;电压范围1.65~1.95(1.8)●VDDANA 管脚:模数转换器供应电源;电压范围3.0~3.6(3.3)VDDIOM、VDDIOP0、VDDIOP1,这些电源使得用户能对存储器接口和外设接口设备分配不同的电源。
接地引脚GND是VDDCORE、VDDIOM、VDDIOP0、VDDIOP1引脚电源的公共端。
VDDBU、VDDPLL、VDDANA采用各自相应的接地管脚:GNDBU、GNDPLL、GNDANA。
广播电视预警信息电子显示屏原理分析及维修泸州广播电视发射台李良富(发表于:成都电子报2011年1月2日第1期)摘要:建设广播电视安全播出预警信息发布系统,构筑了覆盖全国的安全播出预警、调度指挥网络,为安全播出提供有力的技术支持。
本文对预警信息发布系统中使用的广播电视预警信息电子显示屏原理进行分析,以便于使用中的维护工作。
关键词:预警信息发布系统 LED显示屏近年来,面对高科技条件下日益严峻的安全播出形势,各级广播电视部门通过加大投入、健全体制、建立制度、完善技术,使得安全播出水平显著提高,进一步完善了广播电视安全播出技术防范体系。
初步形成了反应快捷、指挥有力、调度灵活、令行禁止的覆盖全国的安全播出调度指挥和管理机制。
特别是完善了广播电视安全播出预警信息发布系统,构筑了覆盖全国的安全播出预警、调度指挥网络,为安全播出提供有力的技术支持。
泸州广播电视发射台台作为泸州地区的主要发射台站,承担了中央、省、地方台的广播电视节目无线发射任务,电子预警屏的安装并投入使用为我台及时启动广播电视安全播出应急预案提供了技术保障。
本文将对广播电视预警信息电子显示屏原理进行分析,以便于使用中的维护工作。
一、系统基本原理GSM(Global System for Mobile communication)系统是目前基于时分多址技术的移动通讯体制中比较成熟、完善、应用最广泛的一种系统。
目前已建成的覆盖全国的GSM数字蜂窝移动通信网是我国公众通信的主要方式。
短信息服务是基于GSM移动网络传送简短信息的无线应用。
GSM的短信息业务(SMS,Short Messaging Service)利用信令信道传输,它不用拨号建立连接,只需把要发的信息加上目的地址发送到短信息服务中心,经短信服务中心完成存储后再发送给最- 1 -终的信宿。
所以当目的GSM终端没开机时信息也不会丢失,每个短信的信息量限制为160字节。
广播电视预警发布系统是全国广电系统通过GSM手机短信息业务(SMS)通讯方式进行广播发布的预警信息发布系统。
AT91SAM9G35中文介绍概述SAM9G35是400 MHz的ARM926嵌入式MPU,支持高带宽通信和先进的用户界面,并进行了优化,工业应用,如楼宇自动化,数据记录仪,POS终端,报警系统和医疗设备的Atmel系列的一员。
SAM9G35具有先进的图形LCD控制器和4层的覆盖和2D加速(子母画面,α混合,缩放,旋转,色彩转换)和一个10位ADC,支持4 - 或5线电阻式触摸屏面板。
多种通信接口包括一个软调制解调器独家支持科胜讯的SmartDAA线路驱动器,的HS USB设备和主机,FS USB主机,10/100以太网MAC,两个HS SD卡/ SDIO / MMC接口,个USART,SPI接口,I2S和TWIS10层总线矩阵,加上2 x 8个DMA通道和专用的DMA通信和接口外设确保不间断的数据传输,以最小的处理器开销。
外部总线接口集成为8银行DDR2/LPDDR,SDRAM / LPSDRAM,静态存储器,以及具体的电路,集成了ECC,高达24位的MLC/ SLC NAND闪存控制器提供支持。
SAM9G35提供的217球BGA封装,球间距为0.8mm。
性能•核心- ARM926EJ-S™ARM®Thumb®的处理器,运行速度高达400 MHz@1.0V + / - 10%- 16 KB的数据Cache,16 KB的指令高速缓存,存储器管理单元•存储器- 一个64字节的内部ROM嵌入引导程序:NAND Flash的启动,SD卡的DataFlash®或串行数据闪存。
可编程顺序。
- 一个32字节的内部SRAM,单周期存取系统的运行速度- 高带宽,多端口的DDR2控制器- 32位外部总线接口支持8银行DDR2/LPDDR,SDR / LPSDR的,静态的存储器- MLC / SLC NAND控制器,24位可编程的多比特错误纠正代码(PMECC)•系统运行速度高达133 MHz- 上电复位单元,复位控制器,关闭控制器,周期间隔定时器,看门狗定时器和实时时钟- 引导模式选择选项,映射命令- 内部低功耗32 kHz的RC和快速工作频率为12MHz RC振荡器- 可选择的32768 Hz的低功耗振荡器和12 MHz振荡器- 优化的PLL为系统和一个PLL频率为480 MHz的USB高速- 12个32位AHB总线矩阵,大带宽传输层- 双外设桥专用的可编程时钟以获得最佳性能- 两个双端口8通道DMA控制器- 高级中断控制器和调试单元- 两个可编程的外部时钟信号•低功耗模式- 关闭控制器,4个32-bit电池备份寄存器- 时钟发生器和电源管理控制器- 非常慢的时钟工作模式,软件可编程功率优化功能•外设- LCD控制器与叠加,alpha混合,旋转,缩放和颜色转换- USB设备高速,高速USB主机和USB主机全速专用片上收发器- 1个10/100 Mbps以太网MAC控制器- 两个高速存储卡主机- 两个主/从串行外设接口- 两个三通道32位定时器/计数器- 一个同步串行控制器- 一个4通道16位PWM控制器- 三双线接口- 三个USART,两个UART- 一个12通道的10位触摸屏模拟到数字转换器- 软调制解调器•I / O- 4个32位并行输入/输出控制器- 105可编程I / O线复用三个外设的I / O- 输入电平变化中断能力对每个I / O线,可选的施密特触发器输入- 独立的可编程开漏,上拉和下拉电阻,同步输出•封装- 217球BGA封装,间距0.8毫米开发板深圳市米尔科技有限公司是ATMEL的官方合作伙伴,也是ARM公司中国区的开发工具合作代理商,自主研发基于AT91SAM9G35芯片的MYD-SAM9G35开发板、MYS-SAM9G35单板机和MYC-SAM9G35核心板包含丰富的软硬件资源,其中软件资源包有KEIL MDK-ARM例程,Linux系统和Android系统,硬件资源包含几乎所有的芯片接口,是工业控制和嵌入式学习的良好选择。
Emlinix感谢您选择英利嵌入式Linux工控主板。
英利EM9x60系列工控主板包括五个型号:EM9160、EM9161、EM9260、EM9360和EM9460。
为便于读者了解和使用英利产品,本手册中一些部分会以EM9160为例进行讲解;一些示例程序也会以EM9160命名。
然而,本手册和上述示例程序完全适用于这五个产品。
英利EM9x60工控主板是面向工业自动化领域的高性价比嵌入式工控主板,其硬件核心为工业级的ARM9芯片AT91SAM9260和AT91SAM9261(EM9161)。
EM9x60预装嵌入式Linux-2.6实时多任务操作系统,并针对板载的各个接口,提供了完整的接口底层驱动以及丰富的应用程序范例。
用户可在此基础上,利用熟悉的各种软件工具直接开发自己的应用程序,以方便、快速地构成各种高性能工控产品。
本手册主要是为在英利嵌入式Linux工控主板上进行Linux应用程序开发的客户提供基本的编程指南。
此外,英利公司针对软硬件开发环境的配置编写有《英利Linux工控主板使用必读(EM9x60)》;针对工控主板和开发评估底板的使用编写有相应的使用手册。
这些手册都包含在英利为用户提供的产品开发光盘里面,用户也可以登录英利公司网站下载相关资料的最新版本。
在使用英利产品进行应用开发的过程中,如果您遇到任何困难需要帮助,都可以通过以下三种方式寻求英利工程师的技术支持:1、直接致电028-******** 853293602、发送邮件到技术支持邮箱support@3、登录英利网站,在技术论坛上直接提问另,本手册以及其它相关技术文档、资料均可以通过英利网站下载。
注:英利公司将会不断完善本手册的相关技术内容,请客户适时从公司网站下载最新版本的手册,恕不另行通知。
再次谢谢您的支持!目录1 前言 (4)2 G++集成开发环境入门 (7)2.1S OURCERY G++IDE下创建和管理C++应用工程 (7)2.2S OURCERY G++IDE下编译C++应用工程 (16)3 通过NFS进行应用程序调试 (20)3.1在W INDOWS开发主机配置NFS服务器 (20)3.2使用NFS在EM9X60主板上挂载应用程序工作目录 (21)3.3应用程序测试运行 (22)3.4应用程序PRINTF语句的使用 (24)4 驱动程序及其调用方法 (25)4.1L INUX驱动程序调用方法概述 (25)4.2精简ISA总线驱动程序 (26)4.3GPIO驱动程序 (28)4.4矩阵键盘驱动程序 (30)4.5外部硬中断驱动程序 (32)4.6看门狗WDT驱动程序 (35)4.7系统配置信息驱动程序 (36)5 应用程序编程范例之一:LCD显示 (38)5.1EM9X60单色LCD显示 (38)5.2EM9161彩色LCD显示 (41)6 应用程序编程范例之二:串口通讯 (46)6.1串口编程接口函数 (46)6.2串口综合应用示例 (47)7 应用程序编程范例之三:TCP服务器 (53)7.1TCP S OCKET编程 (53)7.2支持多连接的TCP服务器应用示例 (53)8 应用程序编程范例之四:TCP客户端 (58)8.1TCP客户端S OCKET编程流程 (58)8.2TCPC LIENT应用示例 (58)附录1 版本信息管理表 (64)1 前言Linux操作系统是当前嵌入式系统中使用最为广泛的操作系统。
特点Array•集成了ARM7TDMI® ARM® Thumb®处理器–高性能的32位RISC架构–高密度的16位指令集–性能/功耗(MIPS/Watt)的领先者–嵌入式ICE电路仿真,支持调试通讯•64K字节的片内高速Flash存储器,共512页,每页128字节–在最坏的条件下可以30 MHz的速度进行单时钟周期访问,预取(Prefetch)缓冲器可以实现Thumb指令的优化,使处理器以最快的速度执行指令–页编程时间为4 ms,包括页自动擦除,全片擦除时间为10 ms–10,000次的写寿命,10年数据保持能力,扇区锁定功能,Flash安全锁定位–适合量产的快速Flash编程接口•16K字节的片内高速SRAM,可以在最高时钟速度下进行单时钟周期访问操作•存储器控制器(MC)–嵌入式Flash控制器,异常中断(Abort)状态及未对齐(Misalignment)检测•复位控制器 (RSTC)–上电复位和经过工厂标定的掉电检测–提供复位源信息以及给外部电路使用的复位信号•时钟发生器(CKGR)– 低耗RC 振荡器,3 到20MHz 的片上振荡器和一个PLL•电源管理控制器(PMC)–可以通过软件进行电源优化,包括慢速时钟模式(低至500 Hz)和空闲(Idle)模式–三个可编程的外部时钟信号•先进的中断控制器(AIC)–可以单独屏蔽的、具有8个优先级的向量式中断源–两个外部中断源和一个快速中断源,可以防止虚假(spurious)中断•调试单元(DBGU)–2线UART,支持调试通讯通道中断;可通过程序来禁止通过ICE进行访问•周期性间隔定时器(PIT)–20位可编程的计数器,加上12位的间隔计数器•时间窗看门狗(WDT)–12位受预设值(key)保护的可编程计数器–为系统提供复位或中断信号–当处理器处于调试状态或空闲模式时可以停止计数器•实时定时器(RTT)–32位自由运行的具有报警功能的计数器–时钟来源于片内RC振荡器•一个并行输入/输出控制器(PIOA)–32个可编程的复用I/O,每个I/O最多可以支持两个外设功能–输入电平改变时,每个I/O都可以产生中断–可以独立编程为开漏输出、使能上拉电阻以及同步输出•11个外设数据控制器(PDC)通道•一个USB 2.0全速(12 Mbps)设备端口–片上收发器,328字节可编程的FIFO•一个同步串行控制器(SSC)–每个接收器和发送器都具有独立的时钟和帧同步信号–支持I²S,支持时分多址–支持32位数据传输的高速连续数据流功能•两个通用的同步/异步收发器(USART)–独立的波特率发生器,IrDA红外调制/解调–支持ISO7816 T0/T1智能卡,硬件握手信号,支持RS485–USART1支持全功能的调制解调器信号•主/从串行外设接口(SPI)–8到16位可编程的数据长度,4个片选线•一个3通道的16位定时器/计数器(TC)–3个外部时钟输入端,每个通道有两个多功能I/O引脚–倍速PWM发生功能,捕捉/波形模式,递增/递减计数2AT91SAM7S64 Preliminary6070A–ATARM–07-Jun-05•一个4通道的16位PWM 控制器(PWMC)•一个两线接口(TWI)–只支持主机模式,支持所有的Atmel 两线EEPROM•一个8通道的10位模数转换器,其中4个通道与数字I/O 复用•IEEE 1149.1 JTAG 边界扫描支持所有的数字引脚•5V 兼容的I/O ,包括4个高达16 mA 的大电流驱动I/O •电源–片上1.8V 电压调节器,可以为内核及外部元件提供高达100 mA 的电流–为I/O 口线提供电源的3.3V VDDIO ,以及独立的为Flash 供电的3.3V VDDFLASH –内核电源为1.8V VDDCORE ,并具有掉电检测(BoD )功能•全静态操作:极限条件下(1.65V ,85°C )高达55 MHz •封装为64脚的LQFP描述AT91SAM7S64是Atmel 32位ARM RISC 处理器小引脚数Flash 微处理器家族的一员。
AT91SAM9x上实现喂狗1 概述ATMEL的AT91SAM系列处理器的看门狗比较特殊,看门狗的模式寄存器只能被编程一次,默认情况下,看门狗是打开的。
这就导致如果在Bootstrap或者U-BOOT阶段对看门狗进行过关闭操作,那么在linux启动后,无法在打开看门狗。
这就是为什么在配置linux内核的时候把AT91SAMx看门狗的选项打开,但是在启动linux的时候系统仍然提示看门狗无法工作。
接下来看看如何让该死的看门狗“看家护院”吧。
以下讲述硬件是AT91SAM9261,u-boot 版本为1.3.4,内核版本为2.6.28。
只是抛砖引玉,其他版本雷同。
2 修改Bootstrap在ATMEL官方提供的Bootstrap程序中,对看门狗进行了关闭工作。
上边说了,看门狗的模式寄存器只能被编程一次。
既然这样,关闭了还怎么打开,注释掉Bootstrap中的关闭看门狗语句。
vi Bootstrap v1.14/board/at91sam9261ek/at91sam9261ek.c 注释掉/* Disable watchdog */ /* writel(AT91C_WDTC_WDDIS, AT91C_BASE_WDTC + WDTC_WDMR); */ 3 在u-boot中喂狗在2步中,把关闭看门狗的操作注释掉了,那么默认情况下,看门狗在慢时钟(SCK=32.768KHz)下工作了。
手册上这个默认的复位时间是16S,我没算过,愿意算的哥们自己算算。
哦,提醒一下,是12位的看门狗。
那么就是最大值就是212/SCK。
既然看门狗工作了,那么就必须在u-boot阶段进行喂狗,否则,正在u-boot的命令行中敲命令,CPU突然复位了,那岂不恼火。
那么,让我们分析一下u-boot,怎么在u-boot中喂狗。
在include/watchdog.h文件中有宏定义:#ifdefCONFIG_HW_WATCHDOG#ifdefined(__ASSEMBLY__)#define WATCHDOG_RESET blhw_watchdog_reset#elseextern void hw_watchdog_reset(void);#define WATCHDOG_RESET hw_watchdog_reset#endif#endif另外,为了在其它地方调用WATCHDOG_RESET函数,可以将watchdog.h添加包含到common.h文件中:#if defined (CONFIG_HW_WATCHDOG)#include#endif然后进行调试,在合适的地方加入喂狗语句:WATCHDOG_RESET();修改串口驱动drivers/serial/atmel_usart.c,主要是在串口读(敲命令)的时候复位看门狗,防止u-boot重启intserial_getc(void){while (!(usart3_readl(CSR) & USART3_BIT(RXRDY))) {WATCHDOG_RESET();}return usart3_readl(RHR);}4在linux中喂狗make ARCH=arm menuconfig使能at91samx看门狗。
【WinCE驱动】基于S3C2440A芯片的看门狗驱动【引子】小弟日前正在开发一个仪器项目,核心芯片采用三星公司的S3C2440A,操作系统移植的是微软公司的WinCE5.0。
在实际调试中发现,系统由于受到强干扰而经常死机,虽然后来在硬件上增加了屏蔽等措施,效果已经很好,但这个问题仍引起了我的重视,因此我打算采用看门狗来增强系统最终的可靠性。
然而,现有的开发包(BSP)并没有看门狗驱动,只能自己动手写了。
经过两个白昼的努力,终于搞定,现将这个看门狗驱动整理出来,以免以后忘记了,毕竟“好记性不如烂笔头”。
【步骤】WinCE下的驱动,一般分为本机驱动(Native Driver)和流驱动(Stream Driver)两种。
对于我们的应用,大多数都可以归结到流驱动,而我的看门狗驱动正是按照流驱动格式来编写的。
基本思路就是利用S3C2440A的定时器1来产生中断,然后在中断程序中完成“喂狗”这一动作,从而实现看门狗功能。
首先,在Drivers目录下建立一个子目录watchdog,然后建立4个文件:makefile、source、wdg.DEF、wdg.c。
【makefile】文件内容如下(就一句):!INCLUDE $(_MAKEENVROOT)\makefile.def【source】文件内容如下:RELEASETYPE=PLATFORMTARGETNAME=wdgTARGETTYPE=DYNLINKTARGETLIBS=$(_COMMONSDKROOT)\lib\$(_CPUINDPATH)\coredll.libDLLENTRY=DllEntryDEFFILE=wdg.defSOURCES = \wdg.c \【wdg.DEF】文件内容如下:LIBRARY wdgEXPORTSwdg_Initwdg_Deinitwdg_Openwdg_Closewdg_Readwdg_Writewdg_Seekwdg_IOControlwdg_PowerUpwdg_PowerDown【wdg.c】文件内容如下:#include <windows.h>#include <types.h>#include <tchar.h>#include <excpt.h>#include <cardserv.h>#include <cardapi.h>#include <tuple.h>#include <devload.h>#include <diskio.h>#include <nkintr.h>#include <windev.h>#include "BSP.h"#define PUBLICHANDLE g_hInstance;HANDLE IntThread;HANDLE IntEvent;UINT32 g_TimerIrq = IRQ_TIMER1;UINT32 g_SysIrq = SYSINTR_UNDEFINED;DWORD dwTime;DWORD wtdata;DWORD num;volatile S3C2440A_W ATCHDOG_REG *v_pWDGregs; // 创建watchdog寄存器指针对象volatile S3C2440A_PWM_REG * v_pPWMregs;volatile S3C2440A_INTR_REG * v_pINTregs;BOOL wdg_InitAddr(void);void Vitural_Alloc(void);void Timer_Init(void);DWORD Timer_IST(void);void Vitural_Alloc(void){/* INTR Register Allocation */v_pINTregs = (volatile S3C2440A_INTR_REG *)VirtualAlloc(0, sizeof(S3C2440A_INTR_REG), MEM_RESERVE, PAGE_NOACCESS);if (v_pINTregs == NULL){ERRORMSG(1,(TEXT("For INTRregs : VirtualAlloc failed!\r\n")));}else{if (!VirtualCopy((PVOID)v_pINTregs, (PVOID)(S3C2440A_BASE_REG_PA_INTR >> 8), sizeof(S3C2440A_INTR_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)){ERRORMSG(1,(TEXT("For INTRregs: VirtualCopy failed!\r\n")));}}/* PWM Register Allocation */v_pPWMregs = (volatile S3C2440A_PWM_REG *)VirtualAlloc(0, sizeof(S3C2440A_PWM_REG), MEM_RESERVE, PAGE_NOACCESS);if (v_pPWMregs == NULL){ERRORMSG(1,(TEXT("For PWMregs : VirtualAlloc failed!\r\n")));}else{if (!VirtualCopy((PVOID)v_pPWMregs, (PVOID)(S3C2440A_BASE_REG_PA_PWM >> 8), sizeof(S3C2440A_PWM_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)){ERRORMSG(1,(TEXT("For PWMregs: VirtualCopy failed!\r\n")));}}}void Timer_Init(void){v_pPWMregs->TCFG0 &= ~0xFF;v_pPWMregs->TCFG0 |= 199; // Timer1 预分频值199v_pPWMregs->TCFG1 &= ~(0x0F<<4);v_pPWMregs->TCFG1 |= (0<<20)|(3<<4); // Timer1 分频值16v_pPWMregs->TCON &= ~(0xF << 8);v_pPWMregs->TCNTB1 = dwTime;v_pPWMregs->TCON |= (2 << 8);v_pPWMregs->TCON |= (9 << 8); //自动装载模式,启动Timerv_pPWMregs->TCON &= ~(1 << 9); //这句很重要,这句不写定时器将不会启动v_pINTregs->INTMSK &= ~(1<<IRQ_TIMER1); //使能Timer中断}DWORD Timer_IST(void){DWORD dwStatus;IntEvent = CreateEvent(NULL, FALSE, FALSE, NULL);if (!IntEvent){RETAILMSG(1, (TEXT("ERROR: Timer: Failed to create event.\r\n")));return FALSE;}if (!InterruptInitialize(g_SysIrq, IntEvent, NULL, 0)){RETAILMSG(1,(TEXT("Fail to initialize Timer interrupt event\r\n")));return FALSE;}while(1){dwStatus=WaitForSingleObject(IntEvent, INFINITE);if(dwStatus == WAIT_OBJECT_0){v_pWDGregs->WTCNT=wtdata;//0x6000;//更新看门狗计数器num++; //测试InterruptDone(g_SysIrq);// RETAILMSG(1,(TEXT("Complete Timer Interrupt.num=%d.\r\n"),num));}else{CloseHandle(IntEvent); //这句很重要}}}BOOLwdg_InitAddr(void){BOOL RetValue = TRUE;v_pWDGregs = (volatile S3C2440A_WATCHDOG_REG *)VirtualAlloc(0, sizeof(S3C2440A_W ATCHDOG_REG), MEM_RESERVE, PAGE_NOACCESS);if (v_pWDGregs == NULL){ERRORMSG(1,(TEXT("For wdg_regs : VirtualAlloc failed!\r\n")));RetValue = FALSE;}else{if (!VirtualCopy((PVOID)v_pWDGregs, (PVOID)(S3C2440A_BASE_REG_PA_W ATCHDOG>> 8), sizeof(S3C2440A_W ATCHDOG_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)){ERRORMSG(1,(TEXT("For wdg_regs: VirtualCopy failed!\r\n")));RetValue = FALSE;}}if (!RetValue){RETAILMSG (1, (TEXT("::: wdg_InitializeAddresses - Fail!!\r\n") ));if (v_pWDGregs){VirtualFree((PVOID) v_pWDGregs, 0, MEM_RELEASE);}v_pWDGregs = NULL;}else{// RETAILMSG (1, (TEXT("wdg_InitializeAddresses - Success\r\n") ));}return(RetValue);}BOOL WINAPIDllEntry(HANDLE hInstDLL,DWORD dwReason,LPVOID lpvReserved){switch(dwReason){case DLL_PROCESS_ATTACH://g_hInstance = hInstDLL;RETAILMSG(1,(TEXT("wdg: DLL_PROCESS_ATTACH.\r\n")));DisableThreadLibraryCalls((HMODULE) hInstDLL);break;//return TRUE;case DLL_THREAD_A TTACH:RETAILMSG(1,(TEXT("wdg: DLL_THREAD_A TTACH\r\n")));break;case DLL_THREAD_DETACH:RETAILMSG(1,(TEXT("wdg: DLL_THREAD_DETACH\r\n")));break;case DLL_PROCESS_DETACH:RETAILMSG(1,(TEXT("wdg: DLL_PROCESS_DETACH\r\n")));break;#ifdef UNDER_CEcase DLL_PROCESS_EXITING:RETAILMSG(1,(TEXT("wdg: DLL_PROCESS_EXITING\r\n")));break;case DLL_SYSTEM_STARTED:RETAILMSG(1,(TEXT("wdg: DLL_SYSTEM_STARTED\r\n")));break;#endif}return TRUE;}DWORD wdg_Init(DWORD dwContext){dwTime = 0x5000;num = 0;wtdata = 0x6000;RETAILMSG(1,(TEXT("wdg: wdg_ INIT.\r\n")));wdg_InitAddr();Vitural_Alloc();if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_TimerIrq, sizeof(UINT32), &g_SysIrq, sizeof(UINT32), NULL)){RETAILMSG(1, (TEXT("ERROR: Timer: Failed to request sysintr value.\r\n")));return FALSE;}Timer_Init();return TRUE;}// Returns handle value for the open instance.DWORD wdg_Open(DWORD dwData,DWORD dwAccess,DWORD dwShareMode){DWORD threadID;v_pWDGregs ->WTCON &= ~((1<<5)|(1<<2)); // Disable Watchdogv_pWDGregs ->WTCNT = wtdata;//0x6000; //20480v_pWDGregs ->WTDAT = wtdata;//0x6000; //20480v_pWDGregs ->WTCON |= (199<<8)|(1<<5)|(0x00>>3);/* 200 presacle,Enable Watchdog,16 division factor */v_pWDGregs ->WTCON |= (1<<0); //start watchdog timerIntThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Timer_IST, 0, 0, &threadID);//创建定时器中断线程if (NULL == IntThread ){RETAILMSG(1,(TEXT("ERROR: failed to Create Timer Thread!\r\n")));return FALSE;}//以下两句为调试打印语句RETAILMSG(1,(TEXT("num=%d,TCNTO1=0x%x.\r\n"),num,v_pPWMregs->TCNTO1)); RETAILMSG(1,(TEXT("wdg:wdg_Open.dwTime=0x%x,wtdata=0x%x,TCNTB1=0x%x,WTCNT=0x%x.\r\n"),dwTime,wtdata, v_pPWMregs->TCNTB1,v_pWDGregs ->WTCNT));return 1;}DWORDwdg_Close(DWORD Handle){v_pPWMregs->TCON |= (0<<8); //停止定时器1v_pINTregs->INTMSK |= (1<<IRQ_TIMER1); //禁止定时器中断v_pWDGregs->WTCON &= ~((1<<5)|(1<<2)); // 禁止看门狗CloseHandle(IntThread);if(IntEvent)CloseHandle(IntEvent);//RETAILMSG(1,(TEXT("num=%d,TCNTO1=0x%x.\r\n"),num,v_pPWMregs->TCNTO1));//RETAILMSG(1,(TEXT("wdg: wdg_ Close.dwTime=0x%x,wtdata=0x%x,TCNTB1=0x%x,WTCNT=0x%x.\r\n"),dwTime,wtdata,v_pPWMregs->TCNTB1,v_pWDGregs ->WTCNT));return TRUE;}// Device deinit - devices are expected to close down.// The device manager does not check the return code.DWORD wdg_Deinit ( DWORD dwContext ){//释放中断资源InterruptDisable(g_SysIrq);KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR, &g_SysIrq, sizeof(UINT32), NULL, 0, NULL);if (v_pPWMregs){VirtualFree((PVOID) v_pPWMregs, 0, MEM_RELEASE);}v_pPWMregs = NULL;if (v_pINTregs){VirtualFree((PVOID) v_pINTregs, 0, MEM_RELEASE);}v_pINTregs = NULL;if (v_pWDGregs){VirtualFree((PVOID) v_pWDGregs, 0, MEM_RELEASE);}v_pWDGregs = NULL;RETAILMSG(1,(TEXT("wdg: wdg_Deinit.\r\n")));return TRUE;}DWORD wdg_IOControl(DWORD Handle,DWORD dwIoControlCode,PBYTE pInBuf,DWORD nInBufSize,PBYTE pOutBuf,DWORD nOutBufSize,PDWORD pBytesReturned){switch(dwIoControlCode){case 0: dwTime = 0x6000; wtdata = 0x6000; break; // dwTime = wtdatacase 1: dwTime = 0x5000; wtdata = 0x6000; break; // dwTime < wtdatacase 2: dwTime = 0x6000; wtdata = 0x5000; break; // dwTime > wtdata//case 3: dwTime = data[0]; wtdata = data[1];break;,}v_pPWMregs->TCNTB1 = dwTime;v_pWDGregs ->WTCNT = wtdata;v_pPWMregs->TCON |= (2 << 8);v_pPWMregs->TCON &= ~(1 << 9); //这句很重要RETAILMSG(1,(TEXT("wdg:wdg_IOControl.dwTime=0x%x,wtdata=0x%x,TCNTB1=0x%x,WTCNT=0x%x.\r\n"),dwTime,wt data, v_pPWMregs->TCNTB1,v_pWDGregs ->WTCNT));return TRUE;}DWORD wdg_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes){RETAILMSG(1,(TEXT("wdg: wdg_Read.\r\n")));*((DWORD*)pBuffer) = dwTime;((DWORD*)pBuffer)++;*((DWORD*)pBuffer) = wtdata;((DWORD*)pBuffer)++;*((DWORD*)pBuffer) = num;return TRUE;}DWORD wdg_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes){RETAILMSG(1,(TEXT("wdg: wdg_Write.\r\n")));dwTime = *((DWORD*)pBuffer);((DWORD*)pBuffer)++;wtdata = *((DWORD*)pBuffer);((DWORD*)pBuffer)++;num = *((DWORD*)pBuffer);v_pPWMregs->TCNTB1 = dwTime;v_pWDGregs ->WTCNT = wtdata;v_pPWMregs->TCON |= (2 << 8);v_pPWMregs->TCON &= ~(1 << 9); //这句很重要RETAILMSG(1,(TEXT("wdg:wdg_IOControl.dwTime=0x%x,wtdata=0x%x.\r\n"),dwTime,wtdata));return TRUE;}DWORD wdg_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod) {return 0;}void wdg_PowerUp(void){return;}void wdg_PowerDown(void){return;}。
Bootstrap的启动过程一、说明:Bootstrap启动代码是官方提供的一级启动代码,包括汇编和C语言两部分组成。
对AT91SAM9260来说编译完成后,代码长度必须小于4KB,烧写到dataflash中的0x00000000.二、系统上电准备Bootstrap启动。
当系统启动选择片内启动(BMS=1)时,程序上电后,启动内部ROM的的固化程序,自动将检测dataflash中前48个字节的数据,如果数据正确,说明是Bootstrap启动代码。
这时候系统自动将存在flashdta中的Bootstrap启动代码搬到SRAM0中去,接下来就进行存储器的REMAP,经过remap后,SRAM0从映射前的0x200000地址被映射到了0x000000地址并且程序从此处开始执行。
三、Bootstrap汇编启动过程1、建立中断向量表。
2、设置堆栈SP的值。
3、主晶振使能为主时钟。
4、数据段的拷贝。
5、对零初始化的数据进行初始化。
6,跳转到C语言main函数。
四、BootstrapC语言初始化过程1、关闭看门狗。
writel(AT91C_WDTC_WDDIS, AT91C_BASE_WDTC + WDTC_WDMR);2、配置PLLA时钟pmc_cfg_plla(PLLA_SETTINGS, PLL_LOCK_TIMEOUT);3、配置MCK时钟pmc_cfg_mck(MCKR_SETTINGS, PLL_LOCK_TIMEOUT);4、配置PLLB时钟pmc_cfg_pllb(PLLB_SETTINGS, PLL_LOCK_TIMEOUT);5、配置CP15协处理器6、配置PIO控制器pio_setup(hw_pio);7、配置外部总线接口EBIwritel((readl((AT91C_BASE_MATRIX+MATRIX_SCFG3))&~0xFF)|0x40,(AT91C_BASE_MATRIX+MATRIX_SCFG3));8、初始化总线矩阵。
AT91SAM7S64调试笔记AT91SAM7S64调试笔记 (1)前言 (3)第一章开发工具与调试环境 (3)一.目标板 (3)二.开发工具 (4)第二章我的第一个实验 (4)一.背景 (4)二.实验目的 (4)三.实验程序和参数设置 (4)四.出现的问题与解决方法 (6)五.总结 (7)第三章点亮我的LED (7)一.背景 (7)二.实验目的 (7)三.实验程序和参数设置 (7)四.总结 (8)第四章键盘输入 (8)一.实验目的 (8)二.实验程序和参数设置 (8)三.出现的问题与解决方法 (8)四.总结 (9)第五章模拟量输入 (9)一.目的 (9)二.实验程序和参数设置 (9)三.总结 (10)第六章 RS232串口通信 (10)一.实验目的 (10)二.实验程序和参数设置 (10)三.出现的问题与解决方法 (11)四.总结 (11)第七章串口DMA控制实验 (12)一.背景 (12)二.实验目的 (12)三.实验程序和参数设置 (12)四.总结 (13)第八章中断控制实验 (13)一.背景 (13)二.实验目的 (13)三.实验程序和参数设置 (13)四.出现的问题与解决方法 (14)五.总结 (15)第九章地址重映射控制实验与重映射后的中断实验 (15)一.背景 (15)二.实验目的 (15)三.实验程序和参数设置 (15)四.出现的问题与解决方法 (21)五.总结 (21)第十章I2C接口实验 (21)一.实验目的 (22)二.实验程序和参数设置 (22)三.出现的问题与解决方法 (24)第十一章 USB 设备实验 (24)一.背景 (24)二.USB驱动安装说明 (24)三.实验目的 (25)四.实验源程序 (25)五.出现的问题与解决方法 (25)六.总结 (26)第十二章 ISP实验 (26)一.背景 (26)二.实验目的 (26)三.操作方法 (26)四.出现的问题与解决方法 (27)五.总结 (28)前言如果您是一个单片机爱好者,当见到一款功能强大、性价比高的处理器时,一定会有一股很想掌握它、运用它的冲动,起码我是这样。
附录一、驱动程序:at91sam9g20核心板的看门狗驱动看门狗的驱动一般来说比较简单,只要做寄存器的设置实现开启、关闭、喂狗功能。
本项目中我们使用的是at91sam920处理器,带有看门狗定时器。
这个看门狗的驱动却比较复杂,应用层想用它的话,将涉及到boot引导设置,uboot配置及驱动,改写驱动程序。
下面将逐步说明。
1、boot引导(bootstrap-v1.15)由于该看门狗的MR寄存器只能写一次(Only a processor reset resets it.),而默认情况下看门狗在boot引导程序中被关闭了,所以在boot引导程序中我们要开启看门狗。
在board/at91sam9g20ek/at91sam9g20ek.c文件的硬件初始化函数hw_init中注释掉下面的配置即可开启看门狗:/* writel(AT91C_WDTC_WDDIS, AT91C_BASE_WDTC + WDTC_WDMR); */为了功能设置:我们配置如下:writel(AT91C_WDTC_WDV | AT91C_WDTC_WDD | AT91C_WDTC_WDRSTEN | AT91C_WDTC_WDFIEN, AT91C_BASE_WDTC + WDTC_WDMR);2、uboot配置及驱动(uboot-v1.3.4):默认情况下,看门狗在uboot中没有配置,需要手动添加配置,在文件include/configs/at91sam9g20ek.h中添加如下配置#define CONFIG_HW_WA TCHDOG 1#define CONFIG_AT91SAM9_WA TCHDOG 1此时编译uboot,会提示你找不到hw_watchdog_reset复位函数,这是因为虽然我们配置看门狗,但看门狗的uboot驱动并不存在,下面就来添加uboot下的看门狗驱动。
1)添加include/asm-arm/arch-at91sam9/at91_wdt.h,内容如下/** [origin: Linux kernel arch/arm/mach-at91/include/mach/at91_wdt.h]** Copyright (C) 2008 Jean-Christophe PLAGNIOL-VILLARD <plagnioj at >* Copyright (C) 2007 Andrew Victor* Copyright (C) 2007 Atmel Corporation.** Watchdog Timer (WDT) - System peripherals regsters.* Based on AT91SAM9261 datasheet revision D.** This program is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Foundation; either version 2 of the License, or* (at your option) any later version.*/#ifndef AT91_WDT_H#define AT91_WDT_H#define AT91_WDT_CR (AT91_WDT + 0x00) /* Watchdog Control Register */ #define AT91_WDT_WDRSTT (1<<0) /* Restart */#define AT91_WDT_KEY (0xa5 << 24) /* KEY Password */#define AT91_WDT_MR (AT91_WDT + 0x04) /* Watchdog Mode Register */ #define AT91_WDT_WDV (0xfff << 0) /* Counter Value */#define AT91_WDT_WDFIEN (1 << 12) /* Fault Interrupt Enable */#define AT91_WDT_WDRSTEN (1 << 13) /* Reset Processor */#define AT91_WDT_WDRPROC (1 << 14) /* Timer Restart */#define AT91_WDT_WDDIS (1<< 15) /* Watchdog Disable */#define AT91_WDT_WDD (0xfff << 16) /* Delta Value */#define AT91_WDT_WDDBGHLT (1 << 28) /* Debug Halt */#define AT91_WDT_WDIDLEHLT (1 << 29) /* Idle Halt */#define AT91_WDT_SR (AT91_WDT + 0x08) /* Watchdog Status Register */#define AT91_WDT_WDUNF (1 << 0) /* Watchdog Underflow */#define AT91_WDT_WDERR (1 << 1) /* Watchdog Error */#endif2)添加drivers/watchdog/at91sam9_wdt.c,内容如下/** [origin: Linux kernel drivers/watchdog/at91sam9_wdt.c]** Watchdog driver for Atmel AT91SAM9x processors.** Copyright (C) 2008 Jean-Christophe PLAGNIOL-VILLARD <plagnioj at > * Copyright (C) 2008 Renaud CERRATO r.cerrato at til-technologies.fr** This program is free software; you can redistribute it and/or* modify it under the terms of the GNU General Public License* as published by the Free Software Foundation; either version* 2 of the License, or (at your option) any later version.*//** The Watchdog Timer Mode Register can be only written to once. If the * timeout need to be set from U-Boot, be sure that the bootstrap doesn't * write to this register. Inform Linux to it too*/#include <common.h>#include <watchdog.h>#include <asm/arch/hardware.h>#include <asm/arch/io.h>#include <asm/arch/at91_wdt.h>//#include <asm-arm/arch-at91sam9/at91_wdt.h>#define ms_to_ticks(t) (((t << 8) / 1000) - 1)#define ticks_to_ms(t) (((t + 1) * 1000) >> 8)/* Hardware timeout in seconds */#define WDT_HW_TIMEOUT 2/** Set the watchdog time interval in 1/256Hz (write-once)* Counter is 12 bit.*/static int at91_wdt_settimeout(unsigned int timeout){unsigned int reg;unsigned int mr;/* Check if disabled */mr = at91_sys_read(AT91_WDT_MR);if (mr & AT91_WDT_WDDIS){printf("sorry, watchdog is disabled/n");return -1;}/** All counting occurs at SLOW_CLOCK / 128 = 256 Hz** Since WDV is a 12-bit counter, the maximum period is* 4096 / 256 = 16 seconds.*/reg = AT91_WDT_WDRSTEN /* causes watchdog reset *//* | AT91_WDT_WDRPROC causes processor reset only */| AT91_WDT_WDDBGHLT /* disabled in debug mode */| AT91_WDT_WDD /* restart at any time */| (timeout & AT91_WDT_WDV); /* timer value */at91_sys_write(AT91_WDT_MR, reg);return 0;}void hw_watchdog_reset(void){at91_sys_write(AT91_WDT_CR,A T91_WDT_KEY | AT91_WDT_WDRSTT); }void hw_watchdog_init(void){/* 16 seconds timer, resets enabled */at91_wdt_settimeout(ms_to_ticks(WDT_HW_TIMEOUT * 1000));}3)添加drivers/watchdog/Makefile## (C) Copyright 2008# Wolfgang Denk, DENX Software Engineering, wd at denx.de.## See file CREDITS for list of people who contributed to this# project.## This program is free software; you can redistribute it and/or# modify it under the terms of the GNU General Public License as# published by the Free Software Foundation; either version 2 of# the License, or (at your option) any later version.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY W ARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details.## You should have received a copy of the GNU General Public License# along with this program; if not, write to the Free Software# Foundation, Inc., 59 Temple Place, Suite 330, Boston,# MA 02111-1307 USA#include $(TOPDIR)/config.mkLIB := $(obj)libwatchdog.aCOBJS-$(CONFIG_AT91SAM9_WATCHDOG) += at91sam9_wdt.oCOBJS := $(COBJS-y)SRCS := $(COBJS:.o=.c)OBJS := $(addprefix $(obj),$(COBJS))all: $(LIB)$(LIB): $(obj).depend $(OBJS)$(AR) $(ARFLAGS) $@ $(OBJS)######################################################################### # defines $(obj).depend targetinclude $(SRCTREE)/rules.mksinclude $(obj).depend######################################################################### 4)修改uboot的Makefile,主要是把watchdog编辑到工程里修改1:LIBS += drivers/video/libvideo.a+LIBS += drivers/watchdog/libwatchdog.a(添加)LIBS += common/libcommon.a修改2:TAG_SUBDIRS += drivers/usbTAG_SUBDIRS += drivers/video+TAG_SUBDIRS += drivers/watchdog (添加)5)另外,为了在其它地方调用WA TCHDOG_RESET函数,可以将watchdog.h添加包含到include/common.h文件中:#if defined (CONFIG_HW_WATCHDOG)#include <watchdog.h>#endif6)修改串口驱动drivers/serial/atmel_usart.c,主要是在串口读的时候复位看门狗,防止系统重启int serial_getc(void){- while (!(usart3_readl(CSR) & USART3_BIT(RXRDY))) ; (删除)+ while (!(usart3_readl(CSR) & USART3_BIT(RXRDY))) (添加)+ WATCHDOG_RESET(); (添加)return usart3_readl(RHR);}3、改写驱动程序(linux2.6.30内核)1、配置内核在默认情况,系统并不加载看门狗驱动,需要配置内核:make menuconfigDevice drivers-->Watchdog Timer Support-->AT91SAM9X / A T91CAP9 watchdog 然后编译,重新烧写uImage文件到板子上。