编写led驱动及其实验过程
1,首先需要打开Ubuntu和putty(远程控制终端)
2,在Ubuntu下运行s5pc100_led程序:s5pc100_led(Makefile s5pc100_led.c test.c)
(1)Make程序:
1 /*******************Makefile****************/ 2 3 MOD_NAME = s5pc100_led 4 5 obj-m = $(MOD_NAME).o 6 7 KERN_DIR = /home/linux/linux-2.6.35-farsight 8 #KERN_DIR = /lib/modules/$(shell uname -r)/build 9 10 all: 11 make -C $(KERN_DIR) M=$(shell pwd) modules 12 arm-cortex_a8-linux-gnueabi-gcc test.c 13 cp a.out *.ko /source/rootfs 14 15 16 clean: 17 rm -rf *.o *.ko *.mod.c *.order \ 18 *.symvers .*.cmd .*versions a.out .*.swp 19 20 21 backup: 22 tar cvf ../$(MOD_NAME).tar.gz ../$(MOD_NAME) 23 cp ../$(MOD_NAME).tar.gz /mnt/hgfs/ubuntu_share
应用程序test.c
/**********test.c********************* #include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <sys/ioctl.h>#define CMD_ON _IO('k', 0) #define CMD_OFF _IO('k', 1)int main(int argc, const char *argv[]) {int fd;fd = open("/dev/led", O_RDWR);if (fd < 0) {perror("open");return -1;}while (1) {ioctl(fd, CMD_ON, 0);sleep(1);ioctl(fd, CMD_OFF, 0);sleep(1);}close(fd);return 0; }
1 /**************s5pc100_led.c***********************/ 2 3 #include <linux/kernel.h> 4 #include <linux/init.h> 5 #include <linux/module.h> 6 #include <linux/cdev.h> 7 #include <linux/fs.h> 8 #include <linux/string.h> 9 #include <asm/uaccess.h> /*copy_to_user copy_from_user*/ 10 #include <asm/io.h> /*ioremap*/ 11 12 #define NUM_MINORS 1 13 #define MINOR_NR 0 14 #define DEV_NAME "s5pc100_led_char" 15 #define KBUF_SIZE 50 16 17 #define CMD_ON _IO('k', 0) 18 #define CMD_OFF _IO('k', 1) 19 20 #define GPG3CON 0xe03001c0 21 #define GPG3DAT 0xe03001c4 22 static int *vgpg3con; 23 static int *vgpg3dat; 24 25 static struct cdev s5pc100_led_cdev; 26 static int s5pc100_led_major = 250; /*Documentation/devices.txt*/ 27 static dev_t s5pc100_led_devno; 28 static char kbuf[KBUF_SIZE]; 29 30 MODULE_LICENSE("GPL"); 31 32 /** 33 * led_init: init led pins 34 */ 35 void led_init(void) 36 { 37 writel((readl(vgpg3con) & ~(0xffff)) | 0x1111, vgpg3con); 38 } 39 40 void led_exit(void) 41 { 42 writel(readl(vgpg3dat) & ~(0xf), vgpg3con); 43 } 44 45 static int s5pc100_led_open(struct inode *nodp, struct file *filp) 46 { 47 led_init(); 48 printk(KERN_INFO "s5pc100_led open! \n"); 49 return 0; 50 } 51 static int s5pc100_led_release(struct inode *nodp, struct file *filp) 52 { 53 led_exit(); 54 printk(KERN_INFO "s5pc100_led release! \n"); 55 return 0; 56 } 57 58 59 static long 60 s5pc100_led_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 61 { 62 switch (cmd) { 63 case CMD_ON: 64 printk(KERN_INFO "cmd = %d arg = %lu \n", cmd, arg); 65 writel(readl(vgpg3dat) | (1 << arg), vgpg3dat); 66 break; 67 case CMD_OFF: 68 printk(KERN_INFO "cmd = %d arg = %lu \n", cmd, arg); 69 writel(readl(vgpg3dat) & ~(1 << arg), vgpg3dat); 70 break; 71 default: 72 printk(KERN_INFO "no such command! \n"); 73 break; 74 } 75 return 0; 76 } 77 78 struct file_operations s5pc100_led_ops = { 79 .open = s5pc100_led_open, 80 .release = s5pc100_led_release, 81 .unlocked_ioctl = s5pc100_led_unlocked_ioctl, 82 }; 83 84 static int __init s5pc100_led_init(void) 85 { 86 int ret; 87 88 /*construct cdev number*/ 89 s5pc100_led_devno = MKDEV(s5pc100_led_major, MINOR_NR); //s5pc100_led_major << 20 | s5pc100_led_minor; 90 ret = register_chrdev_region(s5pc100_led_devno, NUM_MINORS, DEV_NAME); 91 92 /*register char dev number*/ 93 if (ret) { 94 printk(KERN_WARNING "register_chrdev_region failed! \n"); 95 ret = alloc_chrdev_region(&s5pc100_led_devno, MINOR_NR, NUM_MINORS, DEV_NAME); 96 if (ret) { 97 printk(KERN_WARNING "alloc chrdev_region failed! \n"); 98 goto err_0; 99 } 100 } 101 102 /*register char device*/ 103 /*cdev initialize*/ 104 cdev_init(&s5pc100_led_cdev, &s5pc100_led_ops); 105 106 /*add to kernel*/ 107 ret = cdev_add(&s5pc100_led_cdev, s5pc100_led_devno, NUM_MINORS); 108 if (ret) { 109 printk(KERN_WARNING "cdev add failed! \n"); 110 goto err_1; 111 } 112 113 /*physical address ---> virtual address*/ 114 vgpg3con = ioremap(GPG3CON, 4); 115 vgpg3dat = ioremap(GPG3DAT, 4); 116 117 printk(KERN_INFO "s5pc100_led_init ! \n"); 118 return 0; 119 120 /*error management*/ 121 err_1: 122 unregister_chrdev_region(s5pc100_led_devno, NUM_MINORS); 123 err_0: 124 return ret; 125 } 126 127 128 static void __exit s5pc100_led_exit(void) 129 { 130 iounmap(vgpg3con); 131 iounmap(vgpg3dat); 132 cdev_del(&s5pc100_led_cdev); 133 unregister_chrdev_region(s5pc100_led_devno, NUM_MINORS); 134 printk("s5pc100_led_exit ! \n"); 135 } 136 137 module_init(s5pc100_led_init); 138 module_exit(s5pc100_led_exit); 139 140 MODULE_AUTHOR("minj@farsight.com.cn"); 141 MODULE_DESCRIPTION("just for test!");
操作过程如下:
3,在putty下做如下操作:
4,yunx后的终端效果如下:(FS_S5PC100 -A板面会有跑马灯现象)
转载于:https://www.cnblogs.com/mo22han/p/4419780.html
编写led驱动及其实验过程相关推荐
- linux cached释放_正点原子Linux第四十一章嵌入式Linux LED驱动开发实验
1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第四十一章嵌入式Linux LED驱动开发实验 上一章我 ...
- 【正点原子Linux连载】第四十一章 嵌入式Linux LED驱动开发实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- 【正点原子MP157连载】第二十一章 嵌入式Linux LED驱动开发实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7
1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...
- 【吃灰板子捡起来】LED驱动开发实验
LED驱动开发实验 一.地址映射 二.内存访问 三.应用源码 四.驱动源码 五.实验总结 一.地址映射 #include <asm/io.h>#define ioremap(cookie, ...
- UP-MOBNET-Ⅱ型实验箱LED驱动控制实验
UP-MOBNET-Ⅱ型实验箱LED驱动控制实验 文章目录 实验箱 实验内容 实验环境 实验原理 硬件接口原理 驱动层程序分析 应用层程序分析: Makefile: 实验步骤 实验目录: 在内核中添加 ...
- Linux LED驱动开发实验(直接操作寄存器 -- 实际开发很少这样做)
目录 Linux 下LED 灯驱动原理 地址映射(ioremap映射.iounmap释放) I/O 内存访问函数 硬件原理图分析 实验程序编写 LED 灯驱动程序编写 APP测试程序编写 运行测试 编 ...
- 嵌入式 Linux LED 驱动开发实验
41.1 Linux 下 LED 灯驱动原理 Linux 下的任何外设驱动,最终都是要配置相应的硬件寄存器.所以本章的 LED 灯驱动最 终也是对 I.MX6ULL 的 IO 口进行配置,与裸机实验不 ...
- linux的led驱动的实验总结,linux设备驱动归纳总结(五):4.写个简单的LED驱动
linux设备驱动归纳总结(五):4.写个简单的LED驱动 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- 树莓派LED驱动编写
编写LED驱动前需要移植树莓派内核,以获得内核源码,内核移植相关方法请参照上一篇<树莓派3B内核移植>. 我们在编写驱动程序的时候,IO空间的起始地址是0x3f000000,加上GPIO的 ...
- <Linux开发>驱动开发 -之-基于pinctrl/gpio子系统的LED驱动
<Linux开发>驱动开发 -之-基于pinctrl/gpio子系统的LED驱动 交叉编译环境搭建: <Linux开发> linux开发工具-之-交叉编译环境搭建 uboot移 ...
最新文章
- iptables配置-Linux系统安全防火墙
- CIC滤波器溢出处理
- kubernetes集群配置dns服务
- python中 yield的用法和生成器generator的说明
- 请求solr服务器未响应,solr与tomcat整合
- 设计模式之——工厂方法模式
- xaml_XAML或JavaFx?
- Python装饰器(一)
- 同级中断可以嵌套吗_这可能是最通俗易懂的方式讲解ARM中断原理以及中断嵌套...
- VMware vCenter 资源池
- Atitit everthing placeholder index list 目录 1.1. sumdoc 2019 zipver t1---t91	1 1.2. 00 sumdoc ever
- 用堆栈和用递归分别实现倒序打印
- java hostwrite_Java IOUtils.write方法代碼示例
- 测试网站速度的8款免费工具推荐
- 国仁猫哥:视频号超详细运营攻略教程;教你如何打造一个优质的视频号【建议收藏】
- 聪明人做生意,打折也能玩出新鲜感!让顾客觉得现在不买就是亏!
- 2022年上海市安全员C证考试试题模拟考试平台操作
- 简单网页制作的一些基础格式
- 背景图片和img图片实用性差异
- opencv颜色识别思路
热门文章
- NGINX(二)内存池
- Appium 控件定位链接整理(appiumdriver)
- fabric usage
- ArcGIS地图文档(mxd)过大的问题
- 14.Mongodb之导出(mongoexport)、导入(mongoimport)
- php zip类,php ZIP压缩类实例步骤详解
- Linux系统的Redis的安装与运行
- 三进制计算机_要做一个编程界优秀的攀登者,首先要认真计算机中的0和1
- [渝粤教育] 广东-国家-开放大学 21秋期末考试标准的研制与编制★10003k1
- 【渝粤教育】国家开放大学2018年秋季 7048-21T危急重症护理学(本) 参考试题