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板面会有跑马灯现象)