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驱动及其实验过程相关推荐

  1. linux cached释放_正点原子Linux第四十一章嵌入式Linux LED驱动开发实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第四十一章嵌入式Linux LED驱动开发实验 上一章我 ...

  2. 【正点原子Linux连载】第四十一章 嵌入式Linux LED驱动开发实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  3. 【正点原子MP157连载】第二十一章 嵌入式Linux LED驱动开发实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  4. 【吃灰板子捡起来】LED驱动开发实验

    LED驱动开发实验 一.地址映射 二.内存访问 三.应用源码 四.驱动源码 五.实验总结 一.地址映射 #include <asm/io.h>#define ioremap(cookie, ...

  5. UP-MOBNET-Ⅱ型实验箱LED驱动控制实验

    UP-MOBNET-Ⅱ型实验箱LED驱动控制实验 文章目录 实验箱 实验内容 实验环境 实验原理 硬件接口原理 驱动层程序分析 应用层程序分析: Makefile: 实验步骤 实验目录: 在内核中添加 ...

  6. Linux LED驱动开发实验(直接操作寄存器 -- 实际开发很少这样做)

    目录 Linux 下LED 灯驱动原理 地址映射(ioremap映射.iounmap释放) I/O 内存访问函数 硬件原理图分析 实验程序编写 LED 灯驱动程序编写 APP测试程序编写 运行测试 编 ...

  7. 嵌入式 Linux LED 驱动开发实验

    41.1 Linux 下 LED 灯驱动原理 Linux 下的任何外设驱动,最终都是要配置相应的硬件寄存器.所以本章的 LED 灯驱动最 终也是对 I.MX6ULL 的 IO 口进行配置,与裸机实验不 ...

  8. linux的led驱动的实验总结,linux设备驱动归纳总结(五):4.写个简单的LED驱动

    linux设备驱动归纳总结(五):4.写个简单的LED驱动 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  9. 树莓派LED驱动编写

    编写LED驱动前需要移植树莓派内核,以获得内核源码,内核移植相关方法请参照上一篇<树莓派3B内核移植>. 我们在编写驱动程序的时候,IO空间的起始地址是0x3f000000,加上GPIO的 ...

  10. <Linux开发>驱动开发 -之-基于pinctrl/gpio子系统的LED驱动

    <Linux开发>驱动开发 -之-基于pinctrl/gpio子系统的LED驱动 交叉编译环境搭建: <Linux开发> linux开发工具-之-交叉编译环境搭建 uboot移 ...

最新文章

  1. iptables配置-Linux系统安全防火墙
  2. CIC滤波器溢出处理
  3. kubernetes集群配置dns服务
  4. python中 yield的用法和生成器generator的说明
  5. 请求solr服务器未响应,solr与tomcat整合
  6. 设计模式之——工厂方法模式
  7. xaml_XAML或JavaFx?
  8. Python装饰器(一)
  9. 同级中断可以嵌套吗_这可能是最通俗易懂的方式讲解ARM中断原理以及中断嵌套...
  10. VMware vCenter 资源池
  11. Atitit everthing placeholder index list 目录 1.1. sumdoc 2019 zipver t1---t91 1 1.2. 00 sumdoc ever
  12. 用堆栈和用递归分别实现倒序打印
  13. java hostwrite_Java IOUtils.write方法代碼示例
  14. 测试网站速度的8款免费工具推荐
  15. 国仁猫哥:视频号超详细运营攻略教程;教你如何打造一个优质的视频号【建议收藏】
  16. 聪明人做生意,打折也能玩出新鲜感!让顾客觉得现在不买就是亏!
  17. 2022年上海市安全员C证考试试题模拟考试平台操作
  18. 简单网页制作的一些基础格式
  19. 背景图片和img图片实用性差异
  20. opencv颜色识别思路

热门文章

  1. NGINX(二)内存池
  2. Appium 控件定位链接整理(appiumdriver)
  3. fabric usage
  4. ArcGIS地图文档(mxd)过大的问题
  5. 14.Mongodb之导出(mongoexport)、导入(mongoimport)
  6. php zip类,php ZIP压缩类实例步骤详解
  7. Linux系统的Redis的安装与运行
  8. 三进制计算机_要做一个编程界优秀的攀登者,首先要认真计算机中的0和1
  9. [渝粤教育] 广东-国家-开放大学 21秋期末考试标准的研制与编制★10003k1
  10. 【渝粤教育】国家开放大学2018年秋季 7048-21T危急重症护理学(本) 参考试题