1、 LED6-GPM5 LED7-GPQ0 LED8-GPQ1 得出结论:8个LED灯使用到的硬件控制器分别为GPM和GPQ两个硬件控制器(2)在芯片手册中找到相应的硬件控制器部分,重心是看懂端口寄存器 本实验要求完成LED流水灯设计,所以需要设置控制器中端口寄存器: GPMCON-设置相应位为输出口 GPMDAT-控制相应位输出高电平-点亮LED灯 输出低电平-熄灭LED灯(3) linux内核中相关寄存器读写函数读寄存器函数 readl(寄存器虚地址);写寄存器函数 writel(值(无符号整型), 寄存器虚地址);具体端口寄存器地址宏定义在/opt/FriendlyARM/linux-2.
2、6.38/arch/arm/mach-s3c64xx/include/mach文件夹下的文件中,如端口M寄存器在gpio-bank-m.h文件中有定义:#define S3C64XX_GPMCON (S3C64XX_GPM_BASE + 0x00)#define S3C64XX_GPMDAT (S3C64XX_GPM_BASE + 0x04)5.2 LED报警灯驱动设计s3c6410_leddrv.c(1)头文件包含和相关宏定义#include linux/delay.hasm/irq.h/#include mach/hardware.hlinux/kernel.hlinux/module.h
3、linux/init.hlinux/mm.hlinux/fs.hlinux/types.hlinux/moduleparam.hlinux/slab.hlinux/errno.hlinux/ioctl.hlinux/cdev.hlinux/string.hlinux/list.hlinux/pci.hasm/uaccess.hasm/atomic.hasm/unistd.hmach/map.hmach/regs-clock.hplat/gpio-cfg.hmach/gpio-bank-e.hmach/gpio-bank-k.h#define ON 1#define OFF 0(2)编写驱动接口
4、函数/* 功能:配置GPM05/GPQ01为输出口 参数:无 返回值: */ void LedConfig(void) /读出端口M控制寄存器(S3C64XX_GPMCON)值,修改并写回相关端口寄存器 /add your code unsigned int tmp; tmp =readl(S3C64XX_GPMCON); tmp &= (0XF0X0)|(0XF0X4)|(0XF0X8)|(0XF0XC)|(0XF0X10)|(0XF0X14); tmp |= (0X10X0)|(0X10X4)|(0X10X8)|(0X10XC)|(0X10X10)|(0X10X14); writel(tm
5、p,S3C64XX_GPMCON); /*点亮第i个LED灯无符号整型变量iLed,表示第i个LED灯 void iLedOn(unsigned int iLed) /读出端口M数据寄存器(S3C64XX_GPKDAT)值,修改并写回相关端口寄存器 /add your code here tmp =readl(S3C64XX_GPMDAT);= (0X10X1)|(0X10X2)|(0X10X3)|(0X1sys/types.hsys/stat.hfcntl.hsys/ioctl.hvoid main() fd=open(_”/dev/leddev”_,O_RDWR); if(fdlinux/
6、watchdog.hlinux/platform_device.hlinux/interrupt.hlinux/clk.hlinux/uaccess.hlinux/io.hlinux/cpufreq.h#undef S3C_VA_WATCHDOG#define S3C_VA_WATCHDOG (0)plat/regs-watchdog.h打开看门狗,允许复位,禁止看门狗中断,并设置看门狗最长看门时间 void WdtConfig(void) /读出看门狗控制寄存器S3C2410_WTCON,保存原值,并按照要求修改 /最后写回看门狗端口控制寄存器S3C2410_WTCON tmp=(0XFF8
7、)|(0X06)|(0X15)|(0X23)|(0XFF2)|(0X11)|(0XFF8)|(0X1void *wdt_thrd_func(void *arg); pthread_t wdt_thd; fd1=open(_/dev/leddev_,O_RDWR);/打开LED设备 if(fd1 fd2=open(_/dev/wdtdev/打开看门狗设备 if(fd2 /创建看门狗喂狗线程 if (pthread_create(&wdt_thd,NULL, wdt_thrd_func,NULL)!=0) printf(Create watchdog thread error!n exit(1); _ioctl(leddev_fd,OFF);_void *wdt_thrd_func(void *arg) /每隔10秒喂狗一次 unsigned int wdt_val=0XFFFF; /喂狗 write(fd2,&wdt_val,sizeof(int); sleep(10); return;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1