天嵌 ARM开发社区

 找回密码
 注册
查看: 2563|回复: 6

动态编译tq210_adc驱动

[复制链接]
tianyi 发表于 2014-4-9 15:40:02 | 显示全部楼层 |阅读模式
使用动态编译内核驱动的方式,编译内核源码/driver/char/tq210_adc.c文件
Makefile文件如下:
  1 SRC_PATH=../../kernel_header/   //内核源码解压路径
  2
  3 all:
  4     make -C $(SRC_PATH) M=`pwd` modules
  5 clean:
  6     rm -rf modules.order *.o *.ko *.mod.* Module*  .tmp* .*cmd
  7
  8 obj-m   += tq210_adc.o

make all后

make -C ../../kernel_header/ M=`pwd` modules
make[1]: 正在进入目录 `/root/workspace/jingshui/user/kernel_header'
  CC [M]  /root/workspace/jingshui/user/drivers/adc/tq210_adc.o
  Building modules, stage 2.
  MODPOST 1 modules
WARNING: "s3c_adc_read" [/root/workspace/jingshui/user/drivers/adc/tq210_adc.ko] undefined!
  CC      /root/workspace/jingshui/user/drivers/adc/tq210_adc.mod.o
  LD [M]  /root/workspace/jingshui/user/drivers/adc/tq210_adc.ko
make[1]:正在离开目录 `/root/workspace/jingshui/user/kernel_header'
拷入开发板
[root@EmbedSky /zst]# insmod tq210_adc.ko
tq210_adc: Unknown symbol s3c_adc_read (err 0)
insmod: can't insert 'tq210_adc.ko': unknown symbol in module or invalid parameter

请问如何解决!
 楼主| tianyi 发表于 2014-4-9 16:12:24 | 显示全部楼层
开发板上
ls /dev下有adc
所以编写程序

13 int main(int argc, char *argv[])
14 {
15     int fd;
16     unsigned int voltage;
17     double AdcInfo;
18     char  tmp[10];
19     int nbit;
20     int port;
21
22     memset(tmp, 0, sizeof(tmp));
23     
24     if (argc != 3) {
25         printf("usage:\n%s <nbit | port>\n", argv[0]);
26         return -1;
27     }
28     
29     nbit = strtoul(argv[1], NULL, 10);
30     port = strtoul(argv[2], NULL, 10);
31
32     fd = open("/dev/adc", O_RDWR);
33     if(fd<0)
34         printf("open failed\n");
35     ioctl(fd, BIT_SELECTED, &nbit);                                                                                                                                                                     
36     ioctl(fd, PORT_SELECTED, &port);
37
38     while (1) {
39         read(fd, &voltage, sizeof(voltage));
40         AdcInfo =  (float)voltage / (1 << nbit) * 3.3;
41         sprintf(tmp, "%.1f", AdcInfo);
42         AdcInfo = atof(tmp);
43         printf("vol = %f\n", AdcInfo);
44         usleep(300000);
45     }
46
47     close(fd);
48     return 0;
49 }

编译将可执行文件拷到开发板上,命令行输入 ./adc_test 12 1 调节开发板上滑动变阻器,电压值无变化,请问是我的ioctl用法有问题吗?
 楼主| tianyi 发表于 2014-4-9 16:13:22 | 显示全部楼层
  9 #define PORT_SELECTED       1
10 #define BIT_SELECTED        3
 楼主| tianyi 发表于 2014-4-9 16:48:46 | 显示全部楼层
哪位斑竹给回答一下呢!
 楼主| tianyi 发表于 2014-4-9 17:35:27 | 显示全部楼层
下班了,还没人回答啊!
亚瑟王 发表于 2014-4-10 09:08:54 | 显示全部楼层
动态编译驱动最好的办法就是在配置单中将其配置为M,然后用命令make modules就可以得到对应的模块了。
至于你说的问题,很怀疑你用的头文件不是内核镜像对应的头文件引起的。
TQ-ZQL 发表于 2014-4-10 09:12:34 | 显示全部楼层
报错不是说了s3c_adc_read这个没有定义么?你在内核是找到它的定义的.c文件,配置下配置单,将它编译进内核里重新烧个内核就行了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-29 13:14 , Processed in 1.078118 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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