一个在QQ2440上使用的最简单LED的linux-2.6的例子, 适合刚刚接触arm-linux的初学者。您还可以在 http://www.arm123.net下载更多资料
源代码: #include <linux/config.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/devfs_fs_kernel.h> #include <linux/miscdevice.h> #include <linux/delay.h> #include <asm/irq.h> #include <asm/arch/regs-gpio.h> #include <asm/hardware.h>
#define DEVICE_NAME "leds" /*定义led设备的名字*/ #define LED_MAJOR 231 /*定义led设备的主设备号*/
static unsigned long led_table [] = { S3C2410_GPB5, S3C2410_GPB6, S3C2410_GPB7, S3C2410_GPB8, };
static unsigned int led_cfg_table [] = { S3C2410_GPB5_OUTP, S3C2410_GPB6_OUTP, S3C2410_GPB7_OUTP, S3C2410_GPB8_OUTP, };
static int sbc2440_leds_ioctl( struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { /*关于ioctl的处理*/ switch(cmd) { case 0: case 1: if (arg > 4) { return -EINVAL; } s3c2410_gpio_setpin(led_table[arg], !cmd); return 0; default: return -EINVAL; } }
static struct file_operations sbc2440_leds_fops = { .owner = THIS_MODULE, .ioctl = sbc2440_leds_ioctl, };
static int __init sbc2440_leds_init(void) { int ret; int i; /*注册字符设备*/ ret = register_chrdev(LED_MAJOR, DEVICE_NAME, &sbc2440_leds_fops); if (ret < 0) { printk(DEVICE_NAME " can't register major number\n"); return ret; }
/*注册到devfs*/ devfs_mk_cdev(MKDEV(LED_MAJOR, 0), S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, DEVICE_NAME); for (i = 0; i < 4; i++) { s3c2410_gpio_cfgpin(led_table, led_cfg_table); s3c2410_gpio_setpin(led_table, 1); }
printk(DEVICE_NAME " initialized\n"); return 0; }
static void __exit sbc2440_leds_exit(void) { devfs_remove(DEVICE_NAME); unregister_chrdev(LED_MAJOR, DEVICE_NAME); }
module_init(sbc2440_leds_init); module_exit(sbc2440_leds_exit);
|