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; }
/************************************************************************** * 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; }