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