Linux за българи: Форуми

Linux секция за напреднали => Хардуерни и софтуерни проблеми => Темата е започната от: bz1pp3d в Sep 04, 2012, 09:14



Титла: GuruPlug SP Usnap GPIO Char Driver
Публикувано от: bz1pp3d в Sep 04, 2012, 09:14
Здравейте! Наскоро ми попадна един от нашумелите plug computers GuruPlug Server Plus (http://www.globalscaletechnologies.com/t-guruplugdetails.aspx).
Реших да си напиша прост драйвър, използващ USNAP интерфейса за GPIO, чиято цел е да ми позволи да използвам определн пин за аутпут. Проблемът е, че когато с юзър-спейс програмка изпращам някъкви данни за писане, ядрото ми връща грешка 22 (Invalid argument).


Ето го сорсът на драйвъра: http://pastebin.com/nuqPf5bG
Ето и какво ми връща dmesg: http://pastebin.com/sDiL951h
Кодът на юзър-спейс програмката: http://pastebin.com/LK0trAGR


Малко пояснения: ядрото е версия 2.6.33.2, компилирано с gpio support;
дивайсът се създава и в /dev посредством "mknod /dev/gpiomod c 222 0", като предварително е проверено, че този номер е свободен
CPU Info:
 guruplug-debian:~# cat /proc/cpuinfo
Processor       : Feroceon 88FR131 rev 1 (v5l)
BogoMIPS        : 1192.75
Features        : swp half thumb fastmult edsp
CPU implementer : 0x56
CPU architecture: 5TE
CPU variant     : 0x2
CPU part        : 0x131
CPU revision    : 1

Hardware        : Marvell GuruPlug Reference Board
Revision        : 0000
Serial          : 0000000000000000

Модулът успешно се зарежда в ядрото.
Всичкият код е компилиран с toolchain-a предоставен от http://www.mentor.com/embedded-software/codesourcery .
 
Някъкви идеи?


Титла: Re: GuruPlug SP Usnap GPIO Char Driver
Публикувано от: ivo1204 в Sep 04, 2012, 17:32
int __init gpiomod_init(void)
{

    /* register character major device number */
    gpiomod_major = register_chrdev(0, DEVICE_NAME, &gpiomod_fops);
    if (gpiomod_major < 0)
    {
        printk(KERN_INFO "Registering the character device failed with %d\n", gpiomod_major);
        return gpiomod_major;
    }
    printk(KERN_INFO "Installing gpiomod driver; assigned major number %d\n", gpiomod_major);

    /* remind of need to make node if non-existent */
    /*    mknod -m 0666 /dev/gpiomod c xxx 0     */
    printk(KERN_INFO "If you want to talk to the device driver,\n");
    printk(KERN_INFO "you'll have to create a device file. \n");
    printk(KERN_INFO "Manually -> mknod -m 0666 %s c %d 0\n", NODE_NAME, gpiomod_major);
   ..
   return 0;
   }
    put_user(...) get_user(...)


Титла: Re: GuruPlug SP Usnap GPIO Char Driver
Публикувано от: bz1pp3d в Sep 04, 2012, 22:24
Код:
WARNING: at drivers/gpio/gpiolib.c:102 gpio_ensure_requested+0x54/0x124()
autorequest GPIO-42
Modules linked in: gpiomod
[<c0034284>] (unwind_backtrace+0x0/0x168) from [<c00433b4>] (warn_slowpath_comm$
[<c00433b4>] (warn_slowpath_common+0x4c/0x64) from [<c0043408>] (warn_slowpath_$
[<c0043408>] (warn_slowpath_fmt+0x28/0x38) from [<c0250348>] (gpio_ensure_reque$
[<c0250348>] (gpio_ensure_requested+0x54/0x124) from [<c02504d8>] (gpio_directi$
[<c02504d8>] (gpio_direction_output+0xc0/0x180) from [<bf000030>] (gpiomod_open$
[<bf000030>] (gpiomod_open+0x1c/0x34 [gpiomod]) from [<c00b00f0>] (chrdev_open+$
[<c00b00f0>] (chrdev_open+0x124/0x204) from [<c00aaf04>] (__dentry_open.isra.18$
[<c00aaf04>] (__dentry_open.isra.18+0xf8/0x2a4) from [<c00b8bb0>] (do_filp_open$
[<c00b8bb0>] (do_filp_open+0x5e4/0x998) from [<c00ac030>] (do_sys_open+0x5c/0x1$
[<c00ac030>] (do_sys_open+0x5c/0x114) from [<c002e960>] (ret_fast_syscall+0x0/0$
---[ end trace 31564e9c57852f74 ]---
GPIO-42: chip request fail, -22
gpio_unexport: gpio42 status -22



Все още получавам този резултат от dmesg ... :/


Титла: Re: GuruPlug SP Usnap GPIO Char Driver
Публикувано от: ivo1204 в Sep 04, 2012, 23:25
Вероятно процесора използва крачетата с няколко алтернативни функции. Теб ти тлябва да бъдат  конфигурирани като GPIO а не USNAP, гледам , като изходи входове
 http://www.newit.co.uk/forum/index.php?topic=401.0
 след това, теб просто ти трябват адресите и бита на крачето, даже и от юзер спейс може да пишеш и четеш  в тях. Иска ровене де...