Пример #1
0
int cec_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
    unsigned int laddr;
	unsigned int uiData;

    DPRINTK(KERN_INFO "%s\n", __FUNCTION__);

    switch (cmd) {
		case CEC_IOC_START:
			cec_start();
			break;
		case CEC_IOC_STOP:
			cec_stop();
			break;
        case CEC_IOC_SETLADDR:
            DPRINTK(KERN_INFO "CEC: ioctl(CEC_IOC_SETLADDR)\n");
            if (get_user(laddr, (unsigned int __user *) arg))
                return -EFAULT;
            DPRINTK(KERN_INFO "CEC: logical address = 0x%02x\n", laddr);
            writeb(laddr & 0x0F, CEC_LOGIC_ADDR);
            break;
		case CEC_IOC_SENDDATA:
			DPRINTK(KERN_INFO "CEC: ioctl(CEC_IOC_SENDDATA)\n");
            if (get_user(uiData, (unsigned int __user *) arg))
                return -EFAULT;
			DPRINTK(KERN_INFO "CEC: SendData = 0x%02x\n", uiData);
			TccCECInterface_SendData( 0, uiData);
			break;
		case CEC_IOC_RECVDATA:
			break;
        default:
            return -EINVAL;
    }

    return 0;
}
Пример #2
0
/**************************************************************************
*  FUNCTION NAME :
*
*      int TccCECInterface_ParseMessage(char *buffer, int size);
*
*  DESCRIPTION : You can add file description here.
*
*  INPUT:
*			buffer	=
*			size	=
*
*  OUTPUT:	int - Return Type
*  			=
*
*  REMARK:	created on 20101224	11:57:52
**************************************************************************/
int TccCECInterface_ParseMessage(char *buffer, int size)
{
    unsigned char lsrc, ldst, opcode;

    lsrc = buffer[0] >> 4;

    DPRINTK(KERN_INFO "CEC lsrc %d buffer[1]:%d !!\n", lsrc , buffer[1]);

    opcode = buffer[1];

    if (TccCECInterface_IgnoreMessage(opcode, lsrc)) {
        DPRINTK(KERN_INFO "### ignore message coming from address 15 (unregistered)\n");
        return -1;
    }

    if (!TccCECInterface_CheckMessageSize(opcode, size)) {
        DPRINTK(KERN_INFO "### invalid message size ###\n");
        return -1;
    }

    /* check if message broadcast/directly addressed */
    if (!TccCECInterface_CheckMessageMode(opcode, (buffer[0] & 0x0F) == CEC_MSG_BROADCAST ? 1 : 0)) {
        DPRINTK(KERN_INFO "### invalid message mode (directly addressed/broadcast) ###\n");
        return -1;
    }

    ldst = lsrc;

//TODO: macroses to extract src and dst logical addresses
//TODO: macros to extract opcode

    switch (opcode) {

    case CEC_OPCODE_GIVE_PHYSICAL_ADDRESS:
    {
        DPRINTK(KERN_INFO "### GIVE PHYSICAL ADDRESS ###\n");
        break;
    }
    case CEC_OPCODE_SET_MENU_LANGUAGE:
    {
        DPRINTK(KERN_INFO "the menu language will be changed!!!\n");
        break;
    }

    case CEC_OPCODE_REPORT_PHYSICAL_ADDRESS:// TV
    case CEC_OPCODE_ACTIVE_SOURCE:        // TV, CEC Switches
    case CEC_OPCODE_ROUTING_CHANGE:        // CEC Switches
    case CEC_OPCODE_ROUTING_INFORMATION:    // CEC Switches
    case CEC_OPCODE_SET_STREAM_PATH:    // CEC Switches
    case CEC_OPCODE_SET_SYSTEM_AUDIO_MODE:    // TV
    case CEC_OPCODE_DEVICE_VENDOR_ID:    // ???
        break;

    case CEC_OPCODE_DECK_CONTROL:
        if (buffer[2] == CEC_DECK_CONTROL_MODE_STOP) {
            DPRINTK(KERN_INFO "### DECK CONTROL : STOP ###\n");
            TccCECInterface_SendData(CEC_OPCODE_DECK_CONTROL, CEC_DECK_CONTROL_MODE_STOP);
        }
        break;

    case CEC_OPCODE_PLAY:
        if (buffer[2] == CEC_PLAY_MODE_PLAY_FORWARD) {
            DPRINTK(KERN_INFO "### PLAY MODE : PLAY ###\n");
            TccCECInterface_SendData(CEC_OPCODE_PLAY, CEC_PLAY_MODE_PLAY_FORWARD);
        }
        else if (buffer[2] == CEC_PLAY_MODE_PLAY_STILL) {
            DPRINTK(KERN_INFO "### PAUSE MODE : PAUSE ###\n");

            TccCECInterface_SendData(CEC_OPCODE_PLAY, CEC_PLAY_MODE_PLAY_STILL);
        }
        break;

    case CEC_OPCODE_STANDBY:
        DPRINTK(KERN_INFO "### switching device into standby... ###\n");
        break;

    case CEC_OPCODE_USER_CONTROL_PRESSED:
        DPRINTK(KERN_INFO "CEC_OPCODE_USER_CONTROL_PRESSED : operation id = %d", buffer[2]);

        switch(buffer[2])
        {
        case CEC_USER_CONTROL_MODE_FAST_FORWARD:
        case CEC_USER_CONTROL_MODE_REWIND:

        case CEC_USER_CONTROL_MODE_SELECT:
        case CEC_USER_CONTROL_MODE_UP:
        case CEC_USER_CONTROL_MODE_DOWN:
        case CEC_USER_CONTROL_MODE_LEFT:
        case CEC_USER_CONTROL_MODE_RIGHT:
        case CEC_USER_CONTROL_MODE_EXIT:

        case CEC_USER_CONTROL_MODE_NUMBER_0:
        case CEC_USER_CONTROL_MODE_NUMBER_1:
        case CEC_USER_CONTROL_MODE_NUMBER_2:
        case CEC_USER_CONTROL_MODE_NUMBER_3:
        case CEC_USER_CONTROL_MODE_NUMBER_4:
        case CEC_USER_CONTROL_MODE_NUMBER_5:
        case CEC_USER_CONTROL_MODE_NUMBER_6:
        case CEC_USER_CONTROL_MODE_NUMBER_7:
        case CEC_USER_CONTROL_MODE_NUMBER_8:
        case CEC_USER_CONTROL_MODE_NUMBER_9:
        case CEC_USER_CONTROL_MODE_DOT:

            TccCECInterface_SendData(CEC_OPCODE_USER_CONTROL_PRESSED, buffer[2]);

            break;
        default:
            break;

        }
        break;

    case CEC_OPCODE_REQUEST_ACTIVE_SOURCE:
        break;
    default:
        break;

    }

    return 1;
}