QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: mwq

驱动编进内核错误指教

[复制链接]
 楼主| 发表于 2005-4-13 20:57:38 | 显示全部楼层
初始化:
static int adcinit(void)
{
  int i;
i=register_chrdev(major,"adc_dev",&adc_ops);
if(i<0)
{printk("adc:i=%d\n",i);
return -EIO;
}
printk("adc register success");
return 0;
}
回复

使用道具 举报

发表于 2005-4-14 10:50:26 | 显示全部楼层
如何在嵌入式LINUX中增加自己的设备驱动程序

驱动程序的使用可以按照两种方式编译,一种是静态编译进内核,另一种是编译成模块以供动态加载。由于uClinux不支持模块动态加载,而且嵌入式LINUX不能够象桌面LINUX那样灵活的使用insmod/rmmod加载卸载设备驱动程序,因而这里只介绍将设备驱动程序静态编译进uClinux内核的方法。
下面以UCLINUX为例,介绍在一个以模块方式出现的驱动程序test.c基础之上,将其编译进内核的一系列步骤:

(1) 改动test.c源带代码
第一步,将原来的:
#include <linux/module.h>
#include <linux/version.h>
char kernel_version[]=UTS_RELEASE;
改动为:
#ifdef MODULE
#include <linux/module.h>
#include <linux/version.h>
char kernel_version[]=UTS_RELEASE;
#else
#define MOD_INC_USE_COUNT
#define MOD_DEC_USE_COUNT
#endif
第二步,新建函数int init_test(void)
将设备注册写在此处:
result=register_chrdev(254,"test",&test_fops);


(2) 将test.c复制到/uclinux/linux/drivers/char目录下,并且在/uclinux/linux/drivers/char目录下mem.c中,int chr_dev_init( )函数中增加如下代码:
#ifdef CONFIG_TESTDRIVE
init_test();
#endif

(3) 在/uclinux/linux/drivers/char目录下Makefile中增加如下代码:
ifeq($(CONFIG_TESTDRIVE),y)
L_OBJS+=test.o
Endif

(4) 在/uclinux/linux/arch/m68knommu目录下config.in中字符设备段里增加如下代码:
bool 'support for testdrive' CONFIG_TESTDRIVE y

(5) 运行make menuconfig(在menuconfig的字符设备选项里你可以看见我们刚刚添加的'support for testdrive'选项,并且已经被选中);make dep;make linux;make linux.text;make linux.data;cat linux.text linux.data > linux.bin。
(6) 在 /uclinux/romdisk/romdisk/dev/目录下创建设备:
mknod test c 254 0
并且在/uclinux/appsrc/下运行make,生成新的Romdisk.s19文件。

到这里,在UCLINUX中增加设备驱动程序的工作可以说是完成了,只要将新的linux.bin与Romdisk.s19烧入目标板中,你就可以使用自己的新设备test了。

HHCN上的一篇文章,如何在嵌入式LINUX中增加自己的设备驱动程序
回复

使用道具 举报

 楼主| 发表于 2005-4-14 19:03:56 | 显示全部楼层
版主,这个东西我也看过,但应该不行的,我们arm 7 的那个东西把内核和文件系统放在一起编译而生成三个文件的,分别是image.rom;image.ram;romfs.img。而不是linux.bin和romdisk.s19?
那版主,现在应该怎么样呢?
回复

使用道具 举报

发表于 2005-4-15 01:57:01 | 显示全部楼层
static int adcinit(void)

这个函数和你之前提到的初始化函数不同啊~~

你好像漏了一步添加设备文件。

按你的程序/proc/devices中看到的是adc_dev以及主设备号,
/dev下看见的才是设备和主,从设备号。
回复

使用道具 举报

 楼主| 发表于 2005-4-15 10:45:34 | 显示全部楼层
大侠,谢谢你的帮忙
还有怎样添加设备文件啊?
你看上面版主的那个贴,那一步是添加设备文件的?
我看上面的那个贴中的芯片应该不是我用的那个s3c44b0的。
我们主要也是按照版主的那个帖来做的。也不知道对不对。
我们把应用程序编进内核,到bin目录下都看不到我们的程序。
我们是按照一下目录来做的:
http://www.hzlitai.com.cn/download/linux/helloworld_armsys.asp
请指教
回复

使用道具 举报

发表于 2005-4-15 15:14:06 | 显示全部楼层
…………………………………………………………………………………………
(6) 在 /uclinux/romdisk/romdisk/dev/目录下创建设备:
mknod test c 254 0
…………………………………………………………………………………………

不行的话换:touch @设备文件名.c.主设备号.从设备号

如果没有/romdisk/目录看看有没有/romfs目录。
回复

使用道具 举报

 楼主| 发表于 2005-4-16 10:37:50 | 显示全部楼层
帖子中的编译内核是这样的:
make dep;make linux;make linux.text;make linux.data;cat linux.text linux.data > linux.bin。
而我们用的是make dep;make clean;make lib_only;make user_only;make romfs; make linux;make image>romfs.rom
而且我们是不用生成新的Romdisk.s19文件;而且我们也没有/uclinux/appsrc/这个目录的。
我们编译出来的romfs.rom是包括了文件系统的。
文章开头又说用静态编译进内核,为什么又要用到mknod呢?
回复

使用道具 举报

发表于 2005-4-16 12:27:15 | 显示全部楼层
主要是看过程,很多文章不会一个字不差的告诉你
回复

使用道具 举报

发表于 2005-4-16 12:28:12 | 显示全部楼层
我的就是这么做的, 上面的那个连接也是一样的,都是uclinux的, 都一样;)
回复

使用道具 举报

 楼主| 发表于 2005-4-16 14:59:30 | 显示全部楼层
版主,什么连接啊?
版主,我上面的那些我都做了,但是还不行。
我会努力的。希望有所突破。
回复

使用道具 举报

 楼主| 发表于 2005-4-16 16:28:47 | 显示全部楼层
大侠,又出现了新的进展了。
我在 /uclinux/romdisk/romdisk/dev/目录下创建设备:@ test c 254 0
$touch @ adc c 100 0
现在在文件的/proc/devices中看到我的驱动了是adc
但是我不能在目标系统的/dev目录下增加了一个名称为test的设备,在/bin目录下增加了一个test文件。而且应用程序又用不了,说打开不了设备。
为什么呢?
后来我又打开了/uclinux/romdisk/romdisk/dev/目录,这时候又看不见adc了。
其实在$touch @ adc c 100 0后生成的是adc文件,而不是◎adc,c,100,0
为什么呢?
我是根据这个网站的文章做的。
http://www.ccit.js.cn/kyzc/xyxb_details.asp?id=142
回复

使用道具 举报

发表于 2005-4-16 19:14:37 | 显示全部楼层
命令是:touch @sdc.c.100.0
中间有“.”,不行再换“,”试试。

而且用不用touch和/proc/devices中有没有驱动无关。
回复

使用道具 举报

 楼主| 发表于 2005-4-16 20:25:07 | 显示全部楼层
那我现在/proc/devices里面有adc这个东西,那这代表什么?代表我的驱动已经编进去了吗?还是没有呢?
其实运行的uclinux,出现什么的时候代表驱动已经编进内核呢?
回复

使用道具 举报

发表于 2005-4-17 00:08:33 | 显示全部楼层
/proc/devices有就表示驱动已经加进去了,
不过要操作设备还要/dev中有设备文件,就是touch命令加的那个。
回复

使用道具 举报

 楼主| 发表于 2005-4-17 19:43:55 | 显示全部楼层
其实touch @sdc.c.100.0 这一个命令是在什么时候加的。
有的是在编译了内核,运行uclinux的时候加;
有的是在编译内核的时候加,如
在firmware\\uClinux-Samsung-2500\\vendors\\Samsung\\2500\\Makefile中添加如下语句(以刚才的设备为例,实际添加时当然要根据你自己的设备名称和设备号来添加):
   mknod $(ROMFSDIR)  /dev/mydrv  c 254 0
   这句话的目的是在内核中创建一个与你的驱动程序对应的设备节点。
那其实是在什么时候加呢?
还有我的/dev目录下没有驱动程序的节点,但我的应用程序好像可以访问驱动程序。
我的调用是这样的:
     fd=open("./adc",O_RDONLY);
我的应用程序好像可以运行。为什么呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-23 02:13 , Processed in 0.045970 second(s), 12 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表