@@ -745,7 +745,7 @@ uint8_t I2C_Receive(I2C_RESPONSE r) {
745
745
746
746
747
747
enum Status I2C_command_start (
748
- uint8_t args [] ,
748
+ uint8_t * * args ,
749
749
uint16_t const args_size ,
750
750
__attribute__ ((unused )) uint8_t * * rets ,
751
751
__attribute__ ((unused )) uint16_t * rets_size
@@ -756,21 +756,21 @@ enum Status I2C_command_start(
756
756
return E_BAD_ARGSIZE ;
757
757
}
758
758
759
- address = * args ;
759
+ address = * * args ;
760
760
761
761
I2C_InitializeIfNot (I2C_GetBaudRate (), I2C_DISABLE_INTERRUPTS );
762
762
I2C_StartSignal ();
763
763
I2C_Transmit (address );
764
764
765
- * rets = args ;
765
+ * rets = * args ;
766
766
(* rets )[0 ] = (uint8_t )I2C2STATbits .ACKSTAT ;
767
767
* rets_size = 1 ;
768
768
769
769
return I2C_ACKNOWLEDGE_STATUS_BIT && I2C2STATbits .BCL ? E_FAILED : E_OK ;
770
770
}
771
771
772
772
enum Status I2C_command_stop (
773
- __attribute__ ((unused )) uint8_t args [] ,
773
+ __attribute__ ((unused )) uint8_t * * args ,
774
774
__attribute__ ((unused )) uint16_t const args_size ,
775
775
__attribute__ ((unused )) uint8_t * * rets ,
776
776
__attribute__ ((unused )) uint16_t * rets_size
@@ -780,7 +780,7 @@ enum Status I2C_command_stop(
780
780
}
781
781
782
782
enum Status I2C_command_wait (
783
- __attribute__ ((unused )) uint8_t args [] ,
783
+ __attribute__ ((unused )) uint8_t * * args ,
784
784
__attribute__ ((unused )) uint16_t const args_size ,
785
785
__attribute__ ((unused )) uint8_t * * rets ,
786
786
__attribute__ ((unused )) uint16_t * rets_size
@@ -790,18 +790,21 @@ enum Status I2C_command_wait(
790
790
}
791
791
792
792
enum Status I2C_command_send (
793
- uint8_t args [] ,
793
+ uint8_t * * args ,
794
794
uint16_t const args_size ,
795
795
uint8_t * * rets ,
796
796
uint16_t * rets_size
797
797
) {
798
- if (args_size != 1 ) {
798
+ uint8_t data = 0 ;
799
+
800
+ if (args_size != sizeof (data )) {
799
801
return E_BAD_ARGSIZE ;
800
802
}
801
803
802
- uint8_t data = * args ;
804
+ data = * * args ;
803
805
I2C_Transmit (data );
804
- * * rets = (uint8_t )I2C2STATbits .ACKSTAT ;
806
+ * rets = * args ;
807
+ (* rets )[0 ] = (uint8_t )I2C2STATbits .ACKSTAT ;
805
808
* rets_size = 1 ;
806
809
807
810
if (I2C_ACKNOWLEDGE_STATUS_BIT && I2C2STATbits .BCL ) {
@@ -811,35 +814,40 @@ enum Status I2C_command_send(
811
814
}
812
815
813
816
enum Status I2C_command_send_burst (
814
- uint8_t args [] ,
817
+ uint8_t * * args ,
815
818
uint16_t const args_size ,
816
819
__attribute__ ((unused )) uint8_t * * rets ,
817
820
__attribute__ ((unused )) uint16_t * rets_size
818
821
) {
819
- if (args_size != 1 ) {
822
+ uint8_t data = 0 ;
823
+
824
+ if (args_size != sizeof (data )) {
820
825
return E_BAD_ARGSIZE ;
821
826
}
822
827
823
- uint8_t const data = * args ;
828
+ data = * * args ;
824
829
I2C_Transmit (data );
825
830
826
831
return E_OK ;
827
832
}
828
833
829
834
enum Status I2C_command_restart (
830
- uint8_t args [] ,
835
+ uint8_t * * args ,
831
836
uint16_t const args_size ,
832
837
uint8_t * * rets ,
833
838
uint16_t * rets_size
834
839
) {
835
- if (args_size != 1 ) {
840
+ uint8_t address = 0 ;
841
+
842
+ if (args_size != sizeof (address )) {
836
843
return E_BAD_ARGSIZE ;
837
844
}
838
845
839
- uint8_t const address = * args ;
846
+ address = * * args ;
840
847
I2C_RestartSignal ();
841
848
I2C_Transmit (address );
842
- * * rets = (uint8_t )I2C2STATbits .ACKSTAT ;
849
+ * rets = * args ;
850
+ (* rets )[0 ] = (uint8_t )I2C2STATbits .ACKSTAT ;
843
851
* rets_size = 1 ;
844
852
845
853
if (I2C_ACKNOWLEDGE_STATUS_BIT && I2C2STATbits .BCL ) {
@@ -850,7 +858,7 @@ enum Status I2C_command_restart(
850
858
}
851
859
852
860
enum Status I2C_command_read_more (
853
- __attribute__ ((unused )) uint8_t args [] ,
861
+ __attribute__ ((unused )) uint8_t * * args ,
854
862
__attribute__ ((unused )) uint16_t const args_size ,
855
863
uint8_t * * rets ,
856
864
uint16_t * rets_size
@@ -862,7 +870,7 @@ enum Status I2C_command_read_more(
862
870
}
863
871
864
872
enum Status I2C_command_read_end (
865
- __attribute__ ((unused )) uint8_t args [] ,
873
+ __attribute__ ((unused )) uint8_t * * args ,
866
874
__attribute__ ((unused )) uint16_t const args_size ,
867
875
uint8_t * * rets ,
868
876
uint16_t * rets_size
@@ -874,22 +882,24 @@ enum Status I2C_command_read_end(
874
882
}
875
883
876
884
enum Status I2C_command_config (
877
- uint8_t args [] ,
885
+ uint8_t * * args ,
878
886
uint16_t const args_size ,
879
887
__attribute__ ((unused )) uint8_t * * rets ,
880
888
__attribute__ ((unused )) uint16_t * rets_size
881
889
) {
882
- if (args_size != 2 ) {
890
+ uint16_t baudrate = BAUD1000000 ;
891
+
892
+ if (args_size != sizeof (baudrate )) {
883
893
return E_BAD_ARGSIZE ;
884
894
}
885
895
886
- uint16_t const baud_rate = * (uint16_t const * const )args ;
887
- I2C_InitializeIfNot (baud_rate , I2C_DISABLE_INTERRUPTS );
896
+ baudrate = * * (uint16_t * * )args ;
897
+ I2C_InitializeIfNot (baudrate , I2C_DISABLE_INTERRUPTS );
888
898
return E_OK ;
889
899
}
890
900
891
901
enum Status I2C_command_status (
892
- __attribute__ ((unused )) uint8_t args [] ,
902
+ __attribute__ ((unused )) uint8_t * * args ,
893
903
__attribute__ ((unused )) uint16_t const args_size ,
894
904
uint8_t * * rets ,
895
905
uint16_t * rets_size
@@ -900,35 +910,38 @@ enum Status I2C_command_status(
900
910
}
901
911
902
912
enum Status I2C_command_read_bulk (
903
- uint8_t * const args ,
913
+ uint8_t * * args ,
904
914
uint16_t const args_size ,
905
915
uint8_t * * rets ,
906
916
uint16_t * rets_size
907
917
) {
908
- if (args_size != 3 ) {
918
+ struct Input {
919
+ uint8_t device ;
920
+ uint8_t address ;
921
+ uint8_t count ;
922
+ uint8_t _pad [0 ];
923
+ } * input = NULL ;
924
+
925
+ if (args_size != sizeof (struct Input ) - sizeof (input -> _pad )) {
909
926
return E_BAD_ARGSIZE ;
910
927
}
911
928
912
- uint8_t const device = args [0 ];
913
- uint8_t const address = args [1 ];
914
- uint8_t count = args [2 ];
929
+ input = (struct Input * )args ;
915
930
916
- if (!count ) {
917
- return E_OK ;
918
- }
931
+ if (!input -> count ) { return E_OK ; }
919
932
920
933
// count is uint8_t and will always fit in payload buffer.
921
934
922
935
I2C_StartSignal ();
923
- I2C_Transmit (device << 1 );
924
- I2C_Transmit (address );
936
+ I2C_Transmit (input -> device << 1 );
937
+ I2C_Transmit (input -> address );
925
938
I2C_RestartSignal ();
926
- I2C_Transmit ((device << 1 ) | 1 );
939
+ I2C_Transmit ((input -> device << 1 ) | 1 );
927
940
928
- * rets = args ; // Write output to payload buffer.
929
- * rets_size = count ;
941
+ * rets = * args ; // Write output to payload buffer.
942
+ * rets_size = input -> count ;
930
943
931
- while (-- count ) {
944
+ while (-- input -> count ) {
932
945
* * rets ++ = (I2C_Receive (I2C_RESPONSE_ACKNOWLEDGE ));
933
946
}
934
947
* * rets = I2C_Receive (I2C_RESPONSE_NEGATIVE_ACKNOWLEDGE );
@@ -938,37 +951,40 @@ enum Status I2C_command_read_bulk(
938
951
}
939
952
940
953
enum Status I2C_command_write_bulk (
941
- uint8_t args [] ,
954
+ uint8_t * * args ,
942
955
uint16_t const args_size ,
943
956
__attribute__ ((unused )) uint8_t * * rets ,
944
957
__attribute__ ((unused )) uint16_t * rets_size
945
958
) {
946
- if (args_size < 2 ) {
959
+ struct Input {
960
+ uint8_t device ;
961
+ uint8_t count ;
962
+ uint8_t data [];
963
+ } * input = NULL ;
964
+
965
+ if (args_size < sizeof (struct Input )) {
947
966
return E_BAD_ARGSIZE ;
948
967
}
949
968
950
- uint8_t const device = args [0 ];
951
- uint8_t const count = args [1 ];
969
+ input = (struct Input * )args ;
952
970
953
- if (args_size != 2U + count ) {
971
+ if (args_size != sizeof ( struct Input ) + input -> count ) {
954
972
return E_BAD_ARGSIZE ;
955
973
}
956
974
957
- uint8_t const * data = args + 2 ;
958
-
959
975
I2C_StartSignal ();
960
- I2C_Transmit (device << 1 );
976
+ I2C_Transmit (input -> device << 1 );
961
977
962
- for (uint8_t i = 0 ; i < count ; i ++ ) {
963
- I2C_Transmit (* data ++ );
978
+ for (uint8_t i = 0 ; i < input -> count ; i ++ ) {
979
+ I2C_Transmit (input -> data [ i ] );
964
980
}
965
981
966
982
I2C_StopSignal ();
967
983
return E_OK ;
968
984
}
969
985
970
986
enum Status I2C_command_enable_smbus (
971
- __attribute__ ((unused )) uint8_t args [] ,
987
+ __attribute__ ((unused )) uint8_t * * args ,
972
988
__attribute__ ((unused )) uint16_t const args_size ,
973
989
__attribute__ ((unused )) uint8_t * * rets ,
974
990
__attribute__ ((unused )) uint16_t * rets_size
@@ -983,7 +999,7 @@ enum Status I2C_command_enable_smbus(
983
999
}
984
1000
985
1001
enum Status I2C_command_disable_smbus (
986
- __attribute__ ((unused )) uint8_t args [] ,
1002
+ __attribute__ ((unused )) uint8_t * * args ,
987
1003
__attribute__ ((unused )) uint16_t const args_size ,
988
1004
__attribute__ ((unused )) uint8_t * * rets ,
989
1005
__attribute__ ((unused )) uint16_t * rets_size
@@ -998,7 +1014,7 @@ enum Status I2C_command_disable_smbus(
998
1014
}
999
1015
1000
1016
enum Status I2C_command_init (
1001
- __attribute__ ((unused )) uint8_t args [] ,
1017
+ __attribute__ ((unused )) uint8_t * * args ,
1002
1018
__attribute__ ((unused )) uint16_t const args_size ,
1003
1019
__attribute__ ((unused )) uint8_t * * rets ,
1004
1020
__attribute__ ((unused )) uint16_t * rets_size
@@ -1009,16 +1025,18 @@ enum Status I2C_command_init(
1009
1025
}
1010
1026
1011
1027
enum Status I2C_command_pull_down (
1012
- uint8_t args [] ,
1028
+ uint8_t * * args ,
1013
1029
uint16_t const args_size ,
1014
1030
__attribute__ ((unused )) uint8_t * * rets ,
1015
1031
__attribute__ ((unused )) uint16_t * rets_size
1016
1032
) {
1017
- if (args_size != 2 ) {
1033
+ uint16_t delay = 0 ;
1034
+
1035
+ if (args_size != sizeof (delay )) {
1018
1036
return E_BAD_ARGSIZE ;
1019
1037
}
1020
1038
1021
- uint16_t const delay = * (uint16_t const * const )args ;
1039
+ delay = * * (uint16_t * * )args ;
1022
1040
I2C_SCL_SetDigitalOutput ();
1023
1041
I2C_SCL_SetLow ();
1024
1042
DELAY_us (delay );
0 commit comments