00001 #include "linuxavcinfo.h"
00002
00003
00004 #include "mythcontext.h"
00005
00006 #define LOC QString("LAVCInfo(): ")
00007
00008 bool LinuxAVCInfo::Update(uint64_t _guid, raw1394handle_t handle,
00009 uint _port, uint _node)
00010 {
00011 port = _port;
00012 node = _node;
00013
00014 if (guid == _guid)
00015 return true;
00016
00018
00019
00020 rom1394_directory dir;
00021 if (rom1394_get_directory(handle, _node, &dir) < 0)
00022 return false;
00023
00024 guid = _guid;
00025 vendorid = dir.vendor_id;
00026 modelid = dir.model_id;
00027 specid = dir.unit_spec_id;
00028 firmware_revision = dir.unit_sw_version;
00029 product_name = QString("%1").arg(dir.label);
00030
00031 if (avc1394_subunit_info(handle, node, (uint32_t*)unit_table) < 0)
00032 memset(unit_table, 0xff, sizeof(unit_table));
00033
00034 return true;
00035 }
00036
00037 bool LinuxAVCInfo::OpenPort(void)
00038 {
00039 LOG(VB_RECORD, LOG_INFO,
00040 LOC + QString("Getting raw1394 handle for port %1").arg(port));
00041 fw_handle = raw1394_new_handle_on_port(port);
00042
00043 if (!fw_handle)
00044 {
00045 LOG(VB_GENERAL, LOG_ERR, LOC + "Unable to get handle for " +
00046 QString("port: %1").arg(port) + ENO);
00047
00048 return false;
00049 }
00050
00051 return true;
00052 }
00053
00054 bool LinuxAVCInfo::ClosePort(void)
00055 {
00056 if (fw_handle)
00057 {
00058 LOG(VB_RECORD, LOG_INFO, LOC + "Releasing raw1394 handle");
00059 raw1394_destroy_handle(fw_handle);
00060 fw_handle = NULL;
00061 }
00062
00063 return true;
00064 }
00065
00066 bool LinuxAVCInfo::SendAVCCommand(
00067 const vector<uint8_t> &_cmd,
00068 vector<uint8_t> &result,
00069 int retry_cnt)
00070 {
00071 retry_cnt = (retry_cnt < 0) ? 2 : retry_cnt;
00072
00073 result.clear();
00074
00075 if (!fw_handle || (node < 0))
00076 return false;
00077
00078 vector<uint8_t> cmd = _cmd;
00079 while (cmd.size() & 0x3)
00080 cmd.push_back(0x00);
00081
00082 if (cmd.size() > 4096)
00083 return false;
00084
00085 uint32_t cmdbuf[1024];
00086 for (uint i = 0; i < cmd.size(); i+=4)
00087 cmdbuf[i>>2] = cmd[i]<<24 | cmd[i+1]<<16 | cmd[i+2]<<8 | cmd[i+3];
00088
00089 uint result_length = 0;
00090
00091 uint32_t *ret = avc1394_transaction_block2(
00092 fw_handle, node, cmdbuf, cmd.size() >> 2,
00093 &result_length, retry_cnt);
00094
00095 if (!ret)
00096 return false;
00097
00098 for (uint i = 0; i < result_length; i++)
00099 {
00100 result.push_back((ret[i]>>24) & 0xff);
00101 result.push_back((ret[i]>>16) & 0xff);
00102 result.push_back((ret[i]>>8) & 0xff);
00103 result.push_back((ret[i]) & 0xff);
00104 }
00105
00106 avc1394_transaction_block_close(fw_handle);
00107
00108 return true;
00109 }