一 在板上运行可执行文件时,遇到了如下错误
line 1: syntax error: unexpected word (expecting ")")
解决方法:
编译方法错误,应该交叉编译。
二 创建设备节点的方法:
mknod /dev/XXX c 主设备号 次设备号
三写在驱动时遇到
can`tchange directary “lib|module”:no such file
解决:
创建lib和module文件夹
四 1.查看设备节点
ls /dev
2.查看注册的设备的位置
cat /pro/devices
led灯源代码:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/poll.h>
#include <linux/irq.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <linux/interrupt.h>
#include <asm/uaccess.h>
#include <linux/platform_device.h>
#include <linux/cdev.h>
#include <linux/miscdevice.h>
#include <linux/slab.h>
#define DEVICE_NAME "leds"
volatile unsigned long GPIOCFG1;
volatile unsigned long GPIOOE1;
volatile unsigned long GPIOOUT1;
static struct led_dev {
dev_t devno;
struct cdev cdev;
};
struct led_dev *leds = NULL;
static int leds_open(struct inode *inode, struct file *file)
{
// printk(KERN_WARNING "open\n");
GPIOCFG1 = (*(volatile unsigned long*) 0xbfd010C4);
GPIOOE1 = (*(volatile unsigned long*)0xbfd010D4);
GPIOOUT1 = (*(volatile unsigned long*)0xbfd010F4);
GPIOCFG1 |= 0x000000C0;
GPIOOE1 &= ~(0x000000C0);
GPIOOUT1 &= ~(0x000000C0);
return 0;
}
static int leds_close(struct inode *inode, struct file *file)
{
printk(KERN_WARNING "close\n");
return 0;
}
static int leds_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg)
{
return 0;
}
static struct file_operations dev_fops = {
.owner = THIS_MODULE,
.open = leds_open,
.unlocked_ioctl = leds_ioctl,
.release = leds_close,
};
static int __init dev_init(void)/*驱动的初始化*/
{
int ret;
dev_t devno=MKDEV(252,0);
ret = register_chrdev_region(devno,1,"leds");/*静态注册设备号*/
if(ret < 0){
printk(KERN_WARNING "leds:can't get major.\n");
goto fail;
}
leds = kmalloc(sizeof(struct led_dev), GFP_KERNEL); /*设备节点分配内存空间*/
if(!leds){
ret = -ENOMEM;
goto fail;
}
memset(leds, 0, sizeof(struct led_dev));
leds->devno = devno;
cdev_init(&leds->cdev, &dev_fops);/*关联操作集*/
leds->cdev.owner = THIS_MODULE;
ret = cdev_add(&leds->cdev, devno, 1);/*将设备加入到系统中*/
if(ret){
printk(KERN_NOTICE "Error %d.\n", ret);
goto fail;
}
printk ("led driver initialized.\n");
return 0;
fail:
if(devno != 0){
unregister_chrdev_region(&devno, 1);
}
if(leds){
kfree(leds);
}
return ret;
}
static void __exit dev_exit(void)/*释放设备节点*/
{
dev_t devno = leds->devno;
cdev_del(&leds->cdev);
if(leds){
kfree(leds);
}
unregister_chrdev_region(devno, 1);
}
module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
测试函数
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
//#define BUFFERSIZE 200
int main( void )
{
int fp = 0 ;
//char str[BUFFERSIZE];
fp = open( "/dev/leds", O_RDWR);
printf("%d\n",fp);
if (fp>0)
printf("Open device successufully!\n");
else
printf("Open device failed\n");
return 0;
}