编写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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值