蚂蚁S9矿板PS led的使用第1课
参考蚂蚁S9矿板引脚定义.csdnPS GPIO 测试# 内核配置CONFIG_GPIO_SYSFSyCONFIG_GPIO_ZYNQygpio子系统测试Zynq Linux GPIO 编号计算GPIO编号GPIO_BASE MIO编号 当前 GPIO_BASE906所以LEDMIOLinux GPIOREDMIO37943GREENMIO38944# 查看 GPIO 控制器rootantbase:~# cat /sys/class/gpio/gpiochip906/labelzynq_gpio# 导出红灯rootantbase:~# echo 943 /sys/class/gpio/exportrootantbase:~# ls /sys/class/gpio/exportgpio943 gpio953 gpio957 gpiochip906 unexport rootantbase:~# echo out /sys/class/gpio/gpio943/direction# 红灯亮rootantbase:~# echo 1 /sys/class/gpio/gpio943/value# 红灯灭rootantbase:~# echo 0 /sys/class/gpio/gpio943/value# 导出绿灯rootantbase:~# echo 944 /sys/class/gpio/exportrootantbase:~# echo out /sys/class/gpio/gpio944/direction# 绿灯亮rootantbase:~# echo 1 /sys/class/gpio/gpio944/value# 绿灯灭rootantbase:~# echo 0 /sys/class/gpio/gpio944/valueled.ko 驱动测试led.c#includelinux/types.h#includelinux/kernel.h#includelinux/init.h#includelinux/module.h#includelinux/fs.h#includelinux/uaccess.h#includeasm/io.h/* * 字符设备 */#defineLED_MAJOR200#defineLED_NAMEled/* * Zynq-7000 PS GPIO寄存器 * * GPIO: * * Bank0: * MIO0 ~ MIO31 * * Bank1: * MIO32 ~ MIO53 * */#defineZYNQ_GPIO_REG_BASE0xE000A000/* * Bank1 GPIO寄存器偏移 * * DATA: * Bank0 0x40 * Bank1 0x44 * * DIRM: * Bank0 0x204 * Bank1 0x244 * * OUTEN: * Bank0 0x208 * Bank1 0x248 * * INTDIS: * Bank0 0x214 * Bank1 0x254 */#defineDATA_OFFSET0x44// GPIO 数据寄存器偏移地址#defineDIRM_OFFSET0x244// GPIO 方向控制寄存器偏移地址#defineOUTEN_OFFSET0x248// GPIO 输出使能寄存器偏移地址#defineINTDIS_OFFSET0x254// GPIO 中断禁止寄存器偏移地址/* * PS GPIO时钟 * * APER_CLK_CTRL bit22 */#defineAPER_CLK_CTRL0xF800012C/* * LED GPIO定义 * * 注意: * * MIO编号 ! GPIO寄存器bit * * Bank1: * * MIO32 - bit0 * MIO33 - bit1 * ... * * MIO37 - bit5 * MIO38 - bit6 * */#defineRED_PIN5// MIO37#defineGREEN_PIN6// MIO38/* * GPIO虚拟地址 */staticvoid__iomem*data_addr;staticvoid__iomem*dirm_addr;staticvoid__iomem*outen_addr;staticvoid__iomem*intdis_addr;staticvoid__iomem*aper_clk_addr;/* * 打开设备 */staticintled_open(structinode*inode,structfile*filp){printk(KERN_INFOled open\n);return0;}/* * 读取 * * 未实现 */staticssize_tled_read(structfile*filp,char__user*buf,size_tcnt,loff_t*offt){return0;}/* * 写LED控制 * * 命令: * * 0x01 RED ON * 0x02 RED OFF * * 0x03 GREEN ON * 0x04 GREEN OFF * */staticssize_tled_write(structfile*filp,constchar__user*buf,size_tcnt,loff_t*offt){charcmd;u32 val;printk(KERN_INFOled_write cnt%ld\n,cnt);/* * 只接受一个字节 */if(cnt!1){printk(KERN_ERRinvalid count%ld\n,cnt);return-EINVAL;}/* * 用户空间复制到内核 */if(copy_from_user(cmd,buf,1)){printk(KERN_ERRcopy_from_user failed\n);return-EFAULT;}printk(KERN_INFOLED cmd0x%02x\n,(unsignedchar)cmd);/* * 读取当前GPIO状态 */valreadl(data_addr);switch(cmd){/* * RED ON * * MIO37 1 */case0x01:val|(1URED_PIN);printk(KERN_INFORED ON\n);break;/* * RED OFF * * MIO37 0 */case0x02:val~(1URED_PIN);printk(KERN_INFORED OFF\n);break;/* * GREEN ON * * MIO38 1 */case0x03:val|(1UGREEN_PIN);printk(KERN_INFOGREEN ON\n);break;/* * GREEN OFF * * MIO38 0 */case0x04:val~(1UGREEN_PIN);printk(KERN_INFOGREEN OFF\n);break;default:printk(KERN_WARNINGunknown cmd0x%02x\n,(unsignedchar)cmd);return-EINVAL;}/* * 更新GPIO输出 */writel(val,data_addr);/* * 等待写入完成 */readl(data_addr);returncnt;}/* * 关闭设备 */staticintled_release(structinode*inode,structfile*filp){printk(KERN_INFOled release\n);return0;}staticstructfile_operationsled_fops{.ownerTHIS_MODULE,.openled_open,.readled_read,.writeled_write,.releaseled_release,};staticint__initled_init(void){u32 val;intret;/* * 映射GPIO寄存器 */data_addrioremap(ZYNQ_GPIO_REG_BASEDATA_OFFSET,4);dirm_addrioremap(ZYNQ_GPIO_REG_BASEDIRM_OFFSET,4);outen_addrioremap(ZYNQ_GPIO_REG_BASEOUTEN_OFFSET,4);intdis_addrioremap(ZYNQ_GPIO_REG_BASEINTDIS_OFFSET,4);aper_clk_addrioremap(APER_CLK_CTRL,4);if(!data_addr||!dirm_addr||!outen_addr||!intdis_addr||!aper_clk_addr){printk(KERN_ERRioremap failed\n);return-ENOMEM;}/* * 开启GPIO时钟 */valreadl(aper_clk_addr);val|(122);writel(val,aper_clk_addr);/* * 禁止GPIO中断 * * Bank1: * * MIO37 bit5 * MIO38 bit6 */valreadl(intdis_addr);val|(1RED_PIN)|(1GREEN_PIN);writel(val,intdis_addr);/* * 设置输出方向 * * 1 输出 */valreadl(dirm_addr);val|(1RED_PIN)|(1GREEN_PIN);writel(val,dirm_addr);/* * 开启输出 */valreadl(outen_addr);val|(1RED_PIN)|(1GREEN_PIN);writel(val,outen_addr);/* * 默认关闭LED * * 当前假设: * * GPIO0 灭 * * 如果硬件低有效 * 这里需要改成置1 */valreadl(data_addr);val~((1RED_PIN)|(1GREEN_PIN));writel(val,data_addr);/* * 注册字符设备 */retregister_chrdev(LED_MAJOR,LED_NAME,led_fops);if(ret0){printk(KERN_ERRregister_chrdev failed\n);iounmap(data_addr);iounmap(dirm_addr);iounmap(outen_addr);iounmap(intdis_addr);iounmap(aper_clk_addr);returnret;}printk(KERN_INFOZynq PS GPIO LED driver loaded\n);printk(KERN_INFOREDMIO37(GPIO943) GREENMIO38(GPIO944)\n);return0;}staticvoid__exitled_exit(void){u32 val;/* * 关闭LED */valreadl(data_addr);val~((1RED_PIN)|(1GREEN_PIN));writel(val,data_addr);unregister_chrdev(LED_MAJOR,LED_NAME);iounmap(data_addr);iounmap(dirm_addr);iounmap(outen_addr);iounmap(intdis_addr);iounmap(aper_clk_addr);printk(KERN_INFOLED driver unloaded\n);}module_init(led_init);module_exit(led_exit);MODULE_AUTHOR(ming);MODULE_DESCRIPTION(Zynq7010 PS GPIO MIO37 MIO38 LED Driver);MODULE_LICENSE(GPL);test_led.py#!/usr/bin/env python# -*- coding: utf-8 -*-importtimeimportos DEV_PATH/dev/leddefled_write(cmd):try:withopen(DEV_PATH,wb)asf:f.write(chr(cmd))exceptExceptionase:print(LED write error:,e)defred_on():print(RED ON)led_write(0x01)defred_off():print(RED OFF)led_write(0x02)defgreen_on():print(GREEN ON)led_write(0x03)defgreen_off():print(GREEN OFF)led_write(0x04)if__name____main__:red_on()time.sleep(2)red_off()green_on()time.sleep(2)green_off()测试rootantbase:~# insmod led.koZynq PS GPIO LED driver loadedREDMIO37GREENMIO38# 红灯亮rootantbase:~# printf \x01 /dev/ledledopenled_writecnt1LEDcmd0x01 RED ON led release# 红灯灭rootantbase:~# printf \x02 /dev/ledledopenled_writecnt1LEDcmd0x02 RED OFF led release# 绿灯亮rootantbase:~# printf \x03 /dev/ledledopenled_writecnt1LEDcmd0x03 GREEN ON led release# 绿灯灭rootantbase:~# printf \x04 /dev/ledledopenled_writecnt1LEDcmd0x04 GREEN OFF led release# python 测试rootantbase:~# python test_led.pyRED ON ledopenled_writecnt1LEDcmd0x01 RED ON led release RED OFF ledopenled_writecnt1LEDcmd0x02 RED OFF led release GREEN ON ledopenled_writecnt1LEDcmd0x03 GREEN ON led release GREEN OFF ledopenled_writecnt1LEDcmd0x04 GREEN OFF led release