亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2134 | 回復(fù): 5
打印 上一主題 下一主題

一個(gè)簡(jiǎn)單的驅(qū)動(dòng)程序出錯(cuò),請(qǐng)高手們指點(diǎn)迷津 [復(fù)制鏈接]

論壇徽章:
1
水瓶座
日期:2014-10-18 20:17:41
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-04-28 16:46 |只看該作者 |倒序?yàn)g覽
小第是個(gè)新手,今天用開發(fā)板寫了個(gè)簡(jiǎn)單的驅(qū)動(dòng)程序,可是出錯(cuò)了。這讓我很糾結(jié)啊,現(xiàn)在是不知如何去解決它了,請(qǐng)高手們指教!
我把我現(xiàn)在的問題說一下,請(qǐng)高人指點(diǎn)下。

我用#insmod uart.ko 裝載程序;
用#cat /proc/devices 看一下驅(qū)動(dòng)程序的主設(shè)備號(hào)為:
252 uart

創(chuàng)建設(shè)備節(jié)點(diǎn)#mknod /dev/uart c 252 0

之后運(yùn)行應(yīng)用程序,得到輸出結(jié)果是:
open start!  
open error: -1

可是我很迷惑是哪里出了差錯(cuò);請(qǐng)高手指點(diǎn)迷津。

下面是我的驅(qū)動(dòng)源程序:

#define rMPLLCON (*(volatile unsigned *)0x7E00F010)
#define rCLKDIVN (*(volatile unsigned *)0X7E00F020)  

#define rGPFCON (*(volatile unsigned *)(0x7F0080A0))
#define rGPFDAT (*(volatile unsigned *)(0x7F0080A4))
#define rGPFPUD (*(volatile unsigned *)(0x7F0080A)


#include<linux/module.h>
#include<linux/version.h>
#include<linux/init.h>
#include<linux/fs.h>
#include<linux/cdev.h>
#include<linux/kernel.h>
#include<linux/stat.h>
#include<linux/errno.h>
#include<linux/kdev_t.h>
#include<linux/types.h>

#define NAME "uart"
MODULE_LICENSE("Dual BSD/GPL";
static dev_t uart_minor=0;
static dev_t uart_major=0;
void delay(void);

struct cdev *my_cdev;
static int uart_release(struct inode *inode, struct file *filp);
static int uart_ioctl(struct file * filp, unsigned int cmd, unsigned long arg);
static int uart_open(struct inode * inode, struct file *filp);

struct file_operations uart_fops =
{
.owner = THIS_MODULE,
.unlocked_ioctl = uart_ioctl,
.open = uart_open,
.release = uart_release,

};
static int uart_ioctl(struct file * filp, unsigned int cmd, unsigned long arg)
{
//int data = arg;
switch(cmd)
{

case 0:
rGPFDAT = (rGPFDAT & ~(0xfU<<14)) | (0x3<<14);
delay();break;
case 1:
rGPFDAT = (rGPFDAT & ~(0xfu<<14));
delay();
break;
}
return 0;
}

static int uart_release(struct inode *inode, struct file *filp)
{
return 0;
}

static int uart_open(struct inode * inode, struct file *filp)
{
rGPFCON = (rGPFCON & ~(0x0fU<<2)|(0x5U<<2;
rGPFPUD = (rGPFPUD & ~(0x0fU<<2)|(0xaU<<2;

return 0;
}

static int __init uart_init()
{
int result = 0, i;
dev_t dev = MKDEV(uart_major,0);
i =register_chrdev_region(dev,1,NAME);
if(i<0)
{
printk(KERN_ALERT "alloc char dev region!";
result = alloc_chrdev_region(&dev,0,1,NAME);
uart_major = MAJOR(dev);
uart_minor = MINOR(dev);
if(result<0)
return result;
}
my_cdev = cdev_alloc();
int err,devno = MKDEV(uart_major, uart_minor);

cdev_init(my_cdev,&uart_fops);
my_cdev->owner = THIS_MODULE;
my_cdev->ops = &uart_fops;

err = cdev_add(my_cdev,devno,1);
if(err)
printk(KERN_NOTICE "Error %d adding uart\n",err);
printk(KERN_ALERT "init OK!\n";
return 0;
}

static int __exit uart_exit()
{
cdev_del(my_cdev);
unregister_chrdev_region(MKDEV(uart_major,0),1);
printk(KERN_ALERT "UART removed!\n";
return 0;
}
void delay(void)
{
unsigned int k;
  for(k = 0; k < 2000000; k++);
}
module_exit(uart_exit);
module_init(uart_init);

我的makefile如下:
obj-m := uart.o
KERNELDIR := /home/linux-2.6.38
PWD := $(shell pwd)

modules :
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

modules_install :
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
.PHONY:clean
clean:
rm -f *.o *.ko *.mod.c *symvers *order


下面是我寫的應(yīng)用程序:
#include<stdlib.h>
#include<stdio.h>
#include<fcntl.h>
int main()
{
int fd;
int loop,num;
printf("open start!\n";
fd = open("/dev/uart",O_RDWR);
if(fd < 0) {
printf("open error: %d\n",fd);
return 0;
}
printf("open OK!\n";
loop = 0;
while(loop < 10) {
ioctl(fd,1,1);
sleep(1);
ioctl(fd,1,2);
loop++;
}
close(fd);
exit(0);
}

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2012-05-02 09:47 |只看該作者
返回出錯(cuò)碼 -1  也就是ENOENT  沒有這個(gè)設(shè)備節(jié)點(diǎn)
LZ自己查查原因吧

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2012-05-05 09:05 |只看該作者
#define rGPFCON (*(volatile unsigned *)(0x7F0080A0))         類似于這樣的句子,在裸奔的時(shí)候沒問題,但是在linux內(nèi)核下運(yùn)行就會(huì)有問題,這里涉及到虛擬地址和物理地址的差別問題,建議使用linux系統(tǒng)下的函數(shù)試試

譬如:
在頭文件   #include <mach/regs-gpio.h>   中對(duì)各寄存器的定義
就有
#define S3C2410_GPFCON           S3C2410_GPIOREG(0x50)
#define S3C2410_GPFDAT           S3C2410_GPIOREG(0x54)
#define S3C2410_GPFUP           S3C2410_GPIOREG(0x5
   

論壇徽章:
1
水瓶座
日期:2014-10-18 20:17:41
4 [報(bào)告]
發(fā)表于 2012-05-05 19:40 |只看該作者
回復(fù) 2# xxw19840406


    可是我用mknod 在/dev/下創(chuàng)建了設(shè)備節(jié)點(diǎn)的啊,

論壇徽章:
1
水瓶座
日期:2014-10-18 20:17:41
5 [報(bào)告]
發(fā)表于 2012-05-05 19:41 |只看該作者
回復(fù) 3# henuzs


    恩,學(xué)習(xí)了,謝謝!

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2012-05-06 08:36 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP