• 5115阅读
  • 7回复

[讨论]要用QT来控制arm9芯片的端口,如何进行操作? [复制链接]

上一主题 下一主题
离线jantw996
 

只看楼主 倒序阅读 楼主  发表于: 2014-04-14
要对QT来控制arm9的端口,让它输出高低电平,然后还有能读取arm9的输入的高低电平,不知道用什么方法去实现?谢谢给个方向,
刚入门QT,学了QT界面编程。
离线lxdmp

只看该作者 1楼 发表于: 2014-04-14
把要读写的IO做成一个字符设备,创建设备节点read/write。
离线dbzhang800

只看该作者 2楼 发表于: 2014-04-15
这个需求和Qt没有关系,只要你知道如何用C、C++ 来控制这个端口,在Qt中直接用即可
离线qzg3007

只看该作者 3楼 发表于: 2014-05-11
回 lxdmp 的帖子
lxdmp:把要读写的IO做成一个字符设备,创建设备节点read/write。 (2014-04-14 22:10) 

看您的回答,就知道您是高手,我也有同样问题,我是2440板,您手中是否有相关的例程,或者相关资料,说得再详细些,如果能有帮助,出点酬劳酬劳也是应该的
离线labhome

只看该作者 4楼 发表于: 2014-05-12
写linux驱动程序
离线guoyun_he

只看该作者 5楼 发表于: 2014-05-12
如果你使用的是linux系统
给你贴一个我几年前写的驱动,控制指示灯和液晶背光的驱动。
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/wait.h>
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/compiler.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/syscalls.h>
#include <linux/sched.h>
#include <linux/time.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/delay.h>
/*******Driver Config Macro***********************************************/
#define USING_BEEP                      1
//#define KEYBOARD_IRQS                   1
#define USING_DEBUG_INFOR               1
#define KERNEL_2_6_8
#ifndef KERNEL_2_6_8
#define KERNEL_2_6_20
#endif

/*******LED Register Macro************************************************/
#define LED_DATA_REGS                   GPIO_PBDR
#define LED_DIRC_REGS                   GPIO_PBDDR

/*******Beep Macro********************************************************/
#define BEEP_MASK                       0x01
#define BEEP_ON                         0x01

/*******Mask Macro********************************************************/
#define LCD_POWER_MASK                  0x10
#define KEYBOARD_MASK                   0x08
#define LED_MASK_ALL                    0x06
#define LED_MASK_FIRST                  0x04
#define LED_MASK_SECOND                 0x02

/*******LED Command Macro*************************************************/
#define LED_CMD_LED1_ON                 0x01
#define LED_CMD_LED2_ON                 0x02

#define LED_CMD_LED1_OFF                0x10
#define LED_CMD_LED2_OFF                0x20
#ifdef USING_BEEP
#define BEEP_CMD_ON                     0x04
#define BEEP_CMD_OFF                    0x40
#endif

#define LCD_CMD_PWOER_ON        0x08
#define LCD_CMD_PWORE_OFF               0x80

/*******Driver Name Macro*************************************************/
#define LED_NAME                        "EP9315 Led Driver"

/*******IRQ Number Macro**************************************************/
#define IRQ_NUM_KEYBOARD                IRQ_GPIO

/*******Function Declear Macro********************************************/
#ifdef KEYBOARD_IRQS
static void keyboard_init(void);
static irqreturn_t ep93xx_keyboard_isr(int irq, void *dev_id, struct pt_regs *regs);
#endif

static void delay(long t);
static void led_init(void);
static void led_first_on(void);
static void led_first_off(void);
static void led_second_on(void);
static void led_second_off(void);

MODULE_LICENSE("GPL");                      // License.
MODULE_AUTHOR("Guoyun He");                 // Author
MODULE_DESCRIPTION("EP9315 Led Driver");    // Descripition

static int major = 0;                       // default to dynamic major.
#ifdef KERNEL_2_6_8
MODULE_PARM(major, "i");
#endif
#ifdef KERNEL_2_6_20
module_param(major, int, 0);
#endif
MODULE_PARM_DESC(major, "Major device number"); // Module parameter description.

/**************************************************************************
* Function Name: static void delay(long t).
* Function Desc: delay sometime.
* Input: t - delay seconds.
* Return: None.
**************************************************************************/
static void delay(long t)
{
    set_current_state(TASK_INTERRUPTIBLE);
    schedule_timeout(t);
}

/**************************************************************************
* Function Name: static irqreturn_t ep93xx_keyboard_isr(int irq,
*                                      void *dev_id, struct pt_regs *regs).
* Function Desc: ep93xx keyboard isr.
* Input: irq -
*        dev_id -
*        regs -
* Return: None.
**************************************************************************/
#ifdef KEYBOARD_IRQS
static irqreturn_t ep93xx_keyboard_isr(int irq, void *dev_id, struct pt_regs *regs)
{
    u32 tmp, mm;
    static unsigned long tt = 0;
    static unsigned long lasttick = 0x00;
    static unsigned char isr_st = 0x00;
    
    //tmp = inl( GPIO_RAWINTSTSTISB );

    tmp = inl( GPIO_INTSTATUSB );      
    tmp &= KEYBOARD_MASK;
    if( tmp == KEYBOARD_MASK )
    {
        outl( tmp, GPIO_BEOI );
        if( ( ( jiffies - lasttick ) > 7 ) && ( isr_st != 0x00 ) )
        {
            isr_st = 0x00;
        }
        if( isr_st == 0x00 )
        {
            tt = jiffies;
            isr_st = 0x01;
        }
        else if( isr_st == 0x01 )
        {
            if( 5 < (jiffies-tt) )
            {
                isr_st = 0x02;
                tt = jiffies;
            }
        }
        else if( isr_st == 0x02 )
        {
            if( 5 < (jiffies-tt) )
            {
                isr_st = 0x03;
                tt = jiffies;
            }
        }
        else if( isr_st == 0x03 )
        {
            if( 5 < (jiffies-tt) )
            {
                isr_st = 0x04;
                tt = jiffies;
            }
        }
        else if( isr_st == 0x04 )
        {
            if( 5 < ( jiffies-tt ) )
            {
                tmp = inl( GPIO_PBDR );                                            // Read LCD Power contrl REGs.    
                mm = tmp & LCD_POWER_MASK;                                         //
                if( mm == LCD_POWER_MASK )
                {
                    tmp &= ~LCD_POWER_MASK;
                }
                else
                {
                    tmp |= LCD_POWER_MASK;
                }
                outl( tmp, GPIO_PBDR );                                            // Out put.
                isr_st = 0x00;
            }
        }
        lasttick = jiffies;
    }
    
    return (IRQ_HANDLED);
}
#endif

#ifdef KEYBOARD_IRQS
/**************************************************************************
* Function Name: static void keyboard_init(void).
* Function Desc: Init Keyboard Interface.
* Input: None.
* Return: None.
**************************************************************************/
static void keyboard_init(void)
{
    u32 tmp;
    
    tmp = inl( GPIO_PBDDR );                                               // Read keyboard direction REGs.
    tmp &= ~KEYBOARD_MASK;                                                 // Set to input mode.
    outl( tmp, GPIO_PBDDR );                                               // Write the REGs.
    
    tmp = inl( GPIO_BINTEN );                                              // Reads the Port B Interrupt register.
    tmp &= ~KEYBOARD_MASK;                                                 // Disable interrupt.
    outl( tmp, GPIO_BINTEN );                                              // Writes to the REGs.
    
    tmp = inl( GPIO_BINTTYPE1 );                                           // Read Port B interrupt type register1.
    //tmp |= KEYBOARD_MASK;                                                  // Set to edge sensitive.
    tmp &= ~KEYBOARD_MASK;                                                 // Set to leverl sensitive.
    outl( tmp, GPIO_BINTTYPE1 );                                           // Write back.
    
    tmp = inl( GPIO_BINTTYPE2 );                                           // Read Port B interrupt type register2.
    tmp &= ~KEYBOARD_MASK;                                                 // Set to failling edge.
    //tmp |= KEYBOARD_MASK;                                                  // Set to Rising edge.
    outl( tmp, GPIO_BINTTYPE2 );                                           // Write back.

    tmp = inl( GPIO_BINTEN );                                              // Read the Port B Interrupt register.
    tmp |= KEYBOARD_MASK;                                                  // Disable interrupt.
    outl( tmp, GPIO_BINTEN );                                              // Write back.
            
    tmp = inl( GPIO_PBDDR );                                               // Read LCD Power direction REGs.
    tmp |= LCD_POWER_MASK;                                                 // Sets to output mode.
    outl( tmp, GPIO_PBDDR );                                               // Write to the REGs.
    
    tmp = inl( GPIO_PBDR );                                                // Read LCD Power contrl REGs.
    tmp |= LCD_POWER_MASK;                                                 // Set the bit.
    outl( tmp, GPIO_PBDR );                                                // Out put.
}

/**************************************************************************
* Function Name: static void keyboard_exit(void).
* Function Desc: Exit Keyboard Interface.
* Input: None.
* Return: None.
**************************************************************************/
static void keyboard_exit(void)
{
    u32 tmp;

    tmp = inl( GPIO_PBDDR );                                               // Read keyboard direction REGs.
    tmp |= KEYBOARD_MASK;                                                  // Set to output mode.
    outl( tmp, GPIO_PBDDR );                                               // Write the REGs.
    
    tmp = inl( GPIO_BINTEN );                                              // Reads the Port B Interrupt register.
    tmp &= ~KEYBOARD_MASK;                                                 // Disable interrupt.
    outl( tmp, GPIO_BINTEN );                                              // Writes to the REGs.    
    
    tmp = inl( GPIO_PBDDR );                                               // Read LCD Power direction REGs.
    tmp |= LCD_POWER_MASK;                                                 // Sets to output mode.
    outl( tmp, GPIO_PBDDR );                                               // Write to the REGs.
    
    tmp = inl( GPIO_PBDR );                                                // Read LCD Power contrl REGs.
    tmp |= LCD_POWER_MASK;                                                 // Set the bit.
    outl( tmp, GPIO_PBDR );                                                // Out put.    
}
#endif

#ifdef USING_BEEP
/**************************************************************************
* Function Name: static void set_beep_on(void).
* Function Desc: Sets the beep on.
* Input: None.
* Return: None.
**************************************************************************/
static void set_beep_on(void)
{
    u32 tmp;

    tmp = inl( LED_DATA_REGS );
    tmp &= ~BEEP_ON;
    outl( tmp, LED_DATA_REGS );
}

/**************************************************************************
* Function Name: static void set_beep_off(void).
* Function Desc: Sets the beep off.
* Input: None.
* Return: None.
**************************************************************************/
static void set_beep_off(void)
{
    u32 tmp;

    tmp = inl( LED_DATA_REGS );
    tmp |= BEEP_ON;
    outl( tmp, LED_DATA_REGS );
}

/**************************************************************************
* Function Name: static void beep_init(void).
* Function Desc: Sets the beep pin as input pin, and init it.
* Input: None.
* Return: None.
**************************************************************************/
static void beep_init(void)
{
    u32 tmp;

    tmp = inl( LED_DIRC_REGS );
    tmp |= BEEP_MASK;
    outl( tmp, LED_DIRC_REGS );

    set_beep_on();
    delay(30);                                                             // Delay 30us.
    set_beep_off();
}

#endif

/**************************************************************************
* Function Name: void led_init(void).
* Function Desc: Init the led gepio.
* Input: None.
* Return: None.
**************************************************************************/
static void led_init(void)
{
    u32 tmp;
    
    tmp = inl( LED_DIRC_REGS );
    tmp |= LED_MASK_ALL;
    outl( tmp, LED_DIRC_REGS );
    
    tmp = inl( LED_DATA_REGS );                                            // Read the register.
    tmp &= ~LED_MASK_ALL;                                                   // Set the led bits off.
    //tmp |= LED_MASK_ALL;                                                  // Set all the led on.
    outl( tmp, LED_DATA_REGS );                                            // Output.

    delay(30);                                                             // Delay 30us.
}

/**************************************************************************
* Function Name: void lcd_init(void).
* Function Desc: Init the lcd gepio.
* Input: None.
* Return: None.
**************************************************************************/
static void lcd_init(void)
{
    u32 tmp;
    
    tmp = inl( LED_DIRC_REGS );
    tmp |= LCD_POWER_MASK;
    outl( tmp, LED_DIRC_REGS );
    
    tmp = inl( LED_DATA_REGS );                                            // Read the register.
    tmp &= ~LCD_POWER_MASK;                                                // power on the black led of the LCD.
    outl( tmp, LED_DATA_REGS );                                            // Output.

    delay(30);                                                             // Delay 30us.
}

/**************************************************************************
* Function Name: void led_first_on(void)
* Function Desc: Sets the first led on.
* Input Para: None.
* Return: None.
**************************************************************************/
static void led_first_on(void)
{
    u32 tmp;

    tmp = inl( LED_DATA_REGS );                                            // Read the register.
    tmp |= LED_MASK_FIRST;                                                 // Set the first led bit.
    outl( tmp, LED_DATA_REGS );                                            // Output.
}

/**************************************************************************
* Function Name: void led_first_off(void)
* Function Desc: Sets the first led off.
* Input Para: None.
* Return: None.
**************************************************************************/
static void led_first_off(void)
{
    u32 tmp;

    tmp = inl( LED_DATA_REGS );                                            // Read the register.
    tmp &= ~LED_MASK_FIRST;                                                // Clear the first led.
    outl( tmp, LED_DATA_REGS );                                            // Output.
}

/**************************************************************************
* Function Name: void led_second_on(void)
* Function Desc: Sets the second led on.
* Input Para: None.
* Return: None.
**************************************************************************/
static void led_second_on(void)
{
    u32 tmp;

    tmp = inl( LED_DATA_REGS );                                          // Read the register.
    tmp |= LED_MASK_SECOND;                                              // Set the second led bits.
    outl( tmp, LED_DATA_REGS );                                          // Output.
}

/**************************************************************************
* Function Name: void led_second_off(void)
* Function Desc: Sets the second led off.
* Input Para: None.
* Return: None.
**************************************************************************/
static void led_second_off(void)
{
    u32 tmp;

    tmp = inl( LED_DATA_REGS );                                         // Read the register.
    tmp &= ~LED_MASK_SECOND;                                             // Clear the second led bit.
    outl( tmp, LED_DATA_REGS );                                         // Output.
}

/**************************************************************************
* Function Name: void lcd_power_on(void)
* Function Desc: Sets the first led on.
* Input Para: None.
* Return: None.
**************************************************************************/
static void lcd_power_on(void)
{
    u32 tmp;

    tmp = inl( LED_DATA_REGS );                                            // Read the register.
    tmp &= ~LCD_POWER_MASK;                                                 // Set the first led bit.
    outl( tmp, LED_DATA_REGS );                                            // Output.
}

/**************************************************************************
* Function Name: void lcd_power_off(void)
* Function Desc: Sets the first led off.
* Input Para: None.
* Return: None.
**************************************************************************/
static void lcd_power_off(void)
{
    u32 tmp;

    tmp = inl( LED_DATA_REGS );                                            // Read the register.
    tmp |= LCD_POWER_MASK;                                                // Clear the first led.
    outl( tmp, LED_DATA_REGS );                                            // Output.
}

/**************************************************************************
* Function Name: static ssize_t ep9315_led_read(struct file *fl,
*                       char __user *buff, size_t len, loff_t *ppos)
* Function Desc: Read the led GPIO register.
* Input Para: fl - file pointer.
*             buff - the buff you want puts the read data in.
*             len  - the length of the data you want to read.
* Return : 1 - read ok.
*          -ENOBUFS - failed.
* Notice : You can only set len to 1.
**************************************************************************/
static ssize_t ep9315_led_read(struct file *fl, char __user *buff,
                               size_t len, loff_t *ppos)
{
    u32 tmp;

    *ppos = 0;                                                           // Avoid complie error.
    if (len > 1)                                                         // Check the read lenght.
    {
        return -ENOBUFS;                                                 // Return error information.
    }

    tmp = inl( LED_DATA_REGS );                                         // Read the register.
    tmp &= LED_MASK_ALL;                                                 // Masked with the led mask.
    buff[0] = (tmp & 0xFF);

    return 1;                                                            // return the data lenght.
}

/**************************************************************************
* Function Name: static ssize_t ep9315_led_write(struct file *fl,
*                       const char __user *buf, size_t len, loff_t *ppos)
* Function Desc: This function write a char to the led register.
* Input Para: fl - File pointer.
*             buf - data wants to write.
*             len - lenght wants to write.
* Return : data lenghts has been wrote.
* Notice : This file just write 1 byte to the led register.
**************************************************************************/
static ssize_t ep9315_led_write(struct file *fl, const char __user *buf,
                                size_t len, loff_t *ppos)
{
    u32 tmp;
    char ch;

    *ppos = 0;  
                                                                            // Just avoid the complie warnning.
    if (len > 1)                                                            // Check the write length.
    {
        return -ENOBUFS;                                                    // Return error msg.
    }
  
    tmp = inl( LED_DATA_REGS );                                            // Read register.
    tmp &= ~LED_MASK_ALL;                                                   //
    ch = buf[0];
    ch &= LED_MASK_ALL;
    tmp |= ch;
    tmp = outl( tmp, LED_DATA_REGS );
    
    return 1;                                                               //
}

/**************************************************************************
* Function Name: int ep9315_led_ioctl(struct inode *node, struct file *fl,
*             unsigned int cmd, unsigned long arg)
* Function DESC:
* Input:
* Output: 0 - Ok.
*         1 - invide command.
**************************************************************************/
static int ep9315_led_ioctl(struct inode *node, struct file *fl,
                            unsigned int cmd, unsigned long arg)
{
    switch(cmd)
    {
    case LED_CMD_LED1_ON:
        led_first_on();
        break;
    case LED_CMD_LED1_OFF:
        led_first_off();
        break;
    case LED_CMD_LED2_ON:
        led_second_on();
        break;
    case LED_CMD_LED2_OFF:
        led_second_off();
        break;
    case LCD_CMD_PWOER_ON:
    lcd_power_on();
        break;
    case LCD_CMD_PWORE_OFF:
    lcd_power_off();
        break;
#ifdef USING_BEEP
    case BEEP_CMD_ON:
        set_beep_on();
        break;
    case BEEP_CMD_OFF:
        set_beep_off();
        break;
#endif
    default:
        return 1;
        break;
    }

    return 0;
}

/**************************************************************************
* Function Name: int ep9315_led_open(struct inode *node, struct file *fl)
* Function DESC: Open file function. Two led will be set in this function.
* Input: fl - handle.
* Output: 0 - Open file successed.
**************************************************************************/
static int ep9315_led_open(struct inode *node, struct file *fl)
{
    return 0;
}

/**************************************************************************
* Function Name: int ep9315_led_release(struct innode *node, struct file *fl)
* Function DESC: Close file function. Two led will be clear in this function.
* Input: fl - handle.
* Output: 0 - Close file failed.
***************************************************************************/
static int ep9315_led_release(struct inode *node, struct file *fl)
{
    return 0;
}

/**************************************************************************
* Structure Name: ep9315_led_fops.
* Structure Type: file_operations.
* Structure Desc: EP9315 LED driver file ops.
***************************************************************************/
static struct file_operations ep9315_led_fops =
{
    .owner   = THIS_MODULE,         // Almost all the time, it is simply initialized to THIS_MODULE.
    .write  = ep9315_led_write,     // Sends data to the device.
    .read    = ep9315_led_read,     // Used to retrieve data from the device.
    .ioctl   = ep9315_led_ioctl,    // The ioctl system call offers a way to issue device-specific commands.
    .open   = ep9315_led_open,      // The first operation performed on the device file,
    .release = ep9315_led_release,  // This operation is invoked when the file structure is being released.
};

/**************************************************************************
* Function Name: int __init ep9315_led_init(void).
* Function DESC: led driver init function.
* Input: None.
* Output: 0 - regiseted ok.
***************************************************************************/
static int __init ep9315_led_init(void)
{
    int retv = 0;

    led_init();
    lcd_init();
    beep_init();
    printk(KERN_DEBUG LED_NAME ": EP9315 Led Driver interfaces.\n");        //    
    retv = register_chrdev(major,LED_NAME,&ep9315_led_fops);                // Regiseter the driver.    
    if (retv < 0)                                                           //
    {
        printk(KERN_ERR LED_NAME ": unable to register character device.\n"); //
        return retv;                                                        // Return.
    }
    if ( !major )                                                           //
    {
        major = retv;                                                       //
        printk(KERN_DEBUG LED_NAME ": got dynamic major %d.\n",major);      //    
    }
    printk("EP9315 Led Driver registered at major %d.\n", major);           // print register information.

#ifdef KEYBOARD_IRQS
    retv = request_irq( IRQ_NUM_KEYBOARD, ep93xx_keyboard_isr,
                        SA_INTERRUPT, "SDQ800 keyboard", &ep93xx_keyboard_isr );
    if( retv )
    {
        printk( KERN_WARNING "SDQ800 Keyboard: failed to get keyboard IRQ:%d.\n",
        IRQ_NUM_KEYBOARD );
        return retv;
    }
    printk( "SDQ800 Keyboard get IRQ Number OK! IRQ Num:%d.\n", IRQ_NUM_KEYBOARD );
    keyboard_init();
#endif    
    return 0;
}

/**************************************************************************
* Function Name: void __exit ep9315_led_cleanup(void).
* Function DESC:
* Input: None.
* Output: None.
**************************************************************************/
static void __exit ep9315_led_cleanup(void)
{
    int retv;

    if(major)                                                               //    
    {
#ifdef KEYBOARD_IRQS
        free_irq(IRQ_NUM_KEYBOARD, &ep93xx_keyboard_isr);
        keyboard_exit();
#endif  
        led_first_on();
        led_second_on();              
        set_beep_off();
        retv = unregister_chrdev(major, LED_NAME);                          // unregister the dirver.
        if (retv < 0)                                                       // check if unregister successed.        
        {
            printk(KERN_ERR LED_NAME " :unregister failed!\n");             // print error messages.
            return;                                                         // 直return.
        }
        printk( LED_NAME ":unregister OK!\n");
    }
}

module_init(ep9315_led_init);
module_exit(ep9315_led_cleanup);



在Qt中使用时,把设备文件打开,用ioctl  来控制就行。不清楚的看看linux C编程和Linux设备驱动相关的书籍。
离线guoyun_he

只看该作者 6楼 发表于: 2014-05-12
QT 里面用c语言调用的一个函数
UCHAR setupLed()
{
    UCHAR wdata[1];

    if( -1 == ( flled = open( "/dev/EP9315_LED", O_RDWR ) ) )
    {
        return 1;
    }
    wdata[0] = 0x04;
    write( flled, wdata, 1 );
    ioctl( flled, 0x80 );

    return 0;
}

离线hp_201111

只看该作者 7楼 发表于: 2014-05-13
回 guoyun_he 的帖子
guoyun_he:如果你使用的是linux系统
给你贴一个我几年前写的驱动,控制指示灯和液晶背光的驱动。
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/wait.h>
....... (2014-05-12 19:54) 

帮顶,不愧侠客!
快速回复
限100 字节
 
上一个 下一个