Skip to content

Commit b142971

Browse files
committedApr 23, 2020
[Fw] Add opcode handler for Samsung Anynet, based on libcec source.
Untested, may not work at all
1 parent cc03db9 commit b142971

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed
 

‎fw/cec2usb/inc/handlers.h

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ void cecReportPhysAddr(const uint8_t st, const uint8_t* data, const uint8_t len)
1717
void cecGivePhysAddr(const uint8_t st, const uint8_t* data, const uint8_t len);
1818
void cecVendorCommand(const uint8_t st, const uint8_t* data, const uint8_t len);
1919
void cecGiveDeckStatus(const uint8_t st, const uint8_t* data, const uint8_t len);
20+
void cecVendorCommandWithID(const uint8_t st, const uint8_t* data, const uint8_t len);
2021

2122
void cecSpy(const uint8_t st, const uint8_t* data, const uint8_t len);
2223

‎fw/cec2usb/src/handlers.c

+33
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,39 @@ void cecVendorCommand(const uint8_t st, const uint8_t* data, const uint8_t len)
115115
}
116116
}
117117

118+
void cecVendorCommandWithID(const uint8_t st, const uint8_t* data, const uint8_t len)
119+
{
120+
uint8_t d[10],olen=0;
121+
d[0] = data[0]>>4;
122+
d[1] = CEC_OPC_VENDOR_COMMAND_WITH_ID;
123+
dbg_s("< cecVendorCommandWithID: len:"); dbg_n(len); dbg_c(' ');
124+
125+
// Samsung Vendor ID
126+
// IDs and reply found in libcec source, thanks to them
127+
if(len >= 5 && data[2] == 0x00 && data[3] == 0x00 && data[4] == 0xf0)
128+
{
129+
if(len >= 6 && data[5] == 0x23)
130+
{
131+
// Keep [2:4] as is, reply with Samsung Vendor ID
132+
d[2] = data[2]; d[3] = data[3]; d[4] = data[4];
133+
d[6] = 0x24;
134+
d[7] = 0x00;
135+
d[8] = 0x80;
136+
olen = 9;
137+
}
138+
else
139+
dbg_s("Unknown Samsung command");
140+
}
141+
else
142+
dbg_s("Unknown vendor ID");
143+
dbg_c('\n');
144+
if(olen)
145+
{
146+
dbg_s("> cecVendorCommandWithID: 0x"); dbg_n(d[2]); dbg_c('\n');
147+
CEC_tx(d,olen,CEC_TX_MAX_TRIES);
148+
}
149+
}
150+
118151
void cecGivePhysAddr(const uint8_t st, const uint8_t* data, const uint8_t len)
119152
{
120153
uint8_t d[5];

‎fw/cec2usb/src/main.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ int main(void)
4747
CEC_registerOpcode(CEC_OPC_VENDOR_COMMAND , &cecVendorCommand); // 0x89
4848
CEC_registerOpcode(CEC_OPC_GIVE_DECK_STATUS , &cecGiveDeckStatus); // 0x1a
4949

50+
CEC_registerOpcode(CEC_OPC_VENDOR_COMMAND_WITH_ID , &cecVendorCommandWithID); // 0xa0
51+
5052
// Broadcast
5153
CEC_registerOpcode(CEC_OPC_REQUEST_ACTIVE_SOURCE , &cecRequestActiveSource); // 0x85
5254
CEC_registerOpcode(CEC_OPC_ROUTING_CHANGE , &cecRoutingChange); // 0x80
@@ -58,7 +60,7 @@ int main(void)
5860
CEC_registerOpcode(CEC_OPC_SET_MENU_LANGUAGE , &cecSetMenuLanguage); // 0x32
5961
CEC_registerOpcode(CEC_OPC_STANDBY , &cecStandBy); // 0x36
6062

61-
CEC_registerOpcode(CEC_OPC_DEVICE_VENDOR_ID , &cecDeviceVendorID); // 0x87
63+
CEC_registerOpcode(CEC_OPC_DEVICE_VENDOR_ID , &cecDeviceVendorID); // 0x87
6264
// Keys
6365
CEC_registerOpcode(CEC_OPC_USER_CONTROL_PRESSED , &cecKeyDown); // 0x44
6466
CEC_registerOpcode(CEC_OPC_USER_CONTROL_RELEASED , &cecKeyUp); // 0x45

0 commit comments

Comments
 (0)
Please sign in to comment.