是这样的,我用以前的老核心板 2.6.13 内核的,当时这些驱动全是字符型的。
做了个测试LED的测试程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/select.h>
void Delay(int iSec,int iUsec)
{
struct timeval tv;
tv.tv_sec=iSec;
tv.tv_usec=iUsec;
select(0,NULL,NULL,NULL,&tv);
}
int main(int argc, char **argv)
{
int on;
int led_no;
int fd;
unsigned long int mm,nn,oo;
if (argc != 5 || sscanf(argv[1],"%d", &on) != 1 || //sscanf(argv[1], "%d", &led_no) != 1 ||
on < 0 || on > 1 ) { //|| led_no < 0 || led_no > 3
fprintf(stderr, "Usage: leds 0|1 times ontime offtime \n"); //led_no
exit(1);
}
sscanf(argv[2],"%d",&mm);
sscanf(argv[3],"%d",&nn);
sscanf(argv[4],"%d",&oo);
fd = open("/dev/greenled", 0); // leds
if (fd < 0) {
perror("open device leds");
exit(1);
}
if(on==1) {
for(;mm--;mm>0) {
ioctl(fd,1);
Delay(0,nn);
//usleep(nn*10000);
ioctl(fd,0);
Delay(0,oo);
//usleep(oo*10000);
}
}
else {
ioctl(fd, 0); //, led_no
}
close(fd);
return 0;
}
相应驱动程序如下:
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/irq.h>
#include <mach/regs-gpio.h>
#include <mach/hardware.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/ioctl.h>
#include <linux/cdev.h>
#include <linux/string.h>
#include <linux/list.h>
#include <linux/pci.h>
#include <linux/gpio.h>
#include <asm/uaccess.h>
#include <asm/atomic.h>
#include <asm/unistd.h>
#define DEVICE_NAME "greenled"
#define MYLED_PORT S3C2410_GPF(1)
#define MYLED_CFG S3C2410_GPIO_OUTPUT
/*
static unsigned long led_table [] = {
S3C2410_GPB(5),
S3C2410_GPB(6),
S3C2410_GPB(7),
S3C2410_GPB(8),
};
static unsigned int led_cfg_table [] = {
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
};
*/
static int myled_ioctl( // sbc2440_leds_ioctl
struct inode *inode,
struct file *file,
unsigned int cmd,
unsigned long arg)
{
switch(cmd) {
case 0:
case 1:
if (arg > 4) {
return -EINVAL;
}
//s3c2410_gpio_setpin(led_table[arg], !cmd);
s3c2410_gpio_setpin(MYLED_PORT, !cmd); // control LED port kathode ,so 0 will take the led shine
return 0;
default:
return -EINVAL;
}
}
static struct file_operations dev_fops = {
.owner = THIS_MODULE,
.ioctl = myled_ioctl, //sbc2440_leds_ioctl,
};
static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &dev_fops,
};
static int __init myled_init(void)
{
int ret;
/* int i;
for (i = 0; i < 4; i++) {
s3c2410_gpio_cfgpin(led_table
, led_cfg_table);
s3c2410_gpio_setpin(led_table, 0);
} */
ret = misc_register(&misc);
s3c2410_gpio_cfgpin(MYLED_PORT, MYLED_CFG);
s3c2410_gpio_setpin(MYLED_PORT, 1);
printk (DEVICE_NAME"\tinitialized\n");
return ret;
}
static void __exit myled_exit(void)
{
misc_deregister(&misc);
}
module_init(myled_init);
module_exit(myled_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("FriendlyARM Inc.");
测试程序结果:
./myled 1 10 500000 500000
./myled 1 6 500000 500000
./myled 1 5 500000 500000
按理应该是LED闪10次、6次、五次。
实际现象却是:运行每个,只闪最后四次,四次以内的命令,LED闪的才正常……
老内核时同样的测试程序,一直是正常……