1 #include <stdlib.h>
2 #include <hal_log.h>
3 #include <hal_cmd.h>
4 #include <hal_clk.h>
5 #include <hal_reset.h>
6 #include <common_ccmu.h>
7 #include <rtthread.h>
8
9 int clk_number[] = {
10 CLK_SRC_NUMBER,
11 CLK_RTC_NUMBER,
12 CLK_NUMBER,
13 CLK_R_NUMBER,
14 0
15 };
16
17 int reset_number[] = {
18 RST_BUS_NUMBER,
19 RST_R_BUS_NUMBER,
20 0,
21 };
22
23 char *strict_clks[] = {
24 "pll-ddr0",
25 "riscv",
26 "pll-cpux",
27 "pll-periph0-parent",
28 "riscv-axi",
29 "apb1",
30 "fanout-27m",
31 NULL,
32 };
33
is_strict_clk(hal_clk_t clk)34 int is_strict_clk(hal_clk_t clk)
35 {
36 int i;
37 for (i = 0; strict_clks[i] != NULL; i++)
38 {
39 if (!strcmp(clk->name, strict_clks[i]))
40 return 1;
41 }
42
43 return 0;
44 }
45
esMEMS_FreeMemSize(void)46 static uint32_t esMEMS_FreeMemSize(void)
47 {
48 rt_uint32_t total, used, max_used;
49 rt_uint32_t aval;
50
51 rt_memory_info(&total, &used, &max_used);
52 aval = total - used;
53 return aval;
54 }
55
cmd_test_ng_ccmu(int argc,char ** argv)56 int cmd_test_ng_ccmu(int argc, char **argv)
57 {
58 int i, j;
59
60 hal_clk_type_t clk_type;
61 hal_clk_id_t clk_id;
62 hal_clk_status_t clk_status;
63 hal_clk_t clk, p_clk;
64 u32 old_rate, new_rate, p_rate;
65
66 hal_reset_type_t reset_type;
67 hal_reset_id_t reset_id;
68 struct reset_control *reset;
69 int reset_status;
70
71 printf("free size = 0x%x\n", esMEMS_FreeMemSize());
72 for (i = HAL_SUNXI_FIXED_CCU; i < HAL_SUNXI_CCU_NUMBER; i++)
73 {
74 clk_type = i;
75 for (j = 0; j < clk_number[i]; j++)
76 {
77 clk_id = j;
78 printf("get clock, type:%d, id:%d\n", clk_type, clk_id);
79 clk = hal_clock_get(clk_type, clk_id);
80
81 clk_status = hal_clock_is_enabled(clk);
82 printf("clock %s status:%s\n", clk->name, clk_status? "disabled" : "enabled");
83 printf("enable clock %s\n", clk->name);
84 hal_clock_enable(clk);
85 clk_status = hal_clock_is_enabled(clk);
86 printf("clock %s status:%s\n", clk->name, clk_status? "disabled" : "enabled");
87
88 if (is_strict_clk(clk))
89 continue;
90
91 p_clk = hal_clk_get_parent(clk);
92 if (p_clk)
93 printf("clock %s\'s parent is: %s\n", clk->name, p_clk->name);
94 else
95 printf("clock %s is root clk\n", clk->name);
96
97 old_rate = hal_clk_get_rate(clk);
98 printf("clockk %s rate: %d\n", clk->name, old_rate);
99 old_rate /= 2;
100 printf("clock %s set rate: %d\n", clk->name, old_rate);
101 hal_clk_set_rate(clk, old_rate);
102 new_rate = hal_clk_get_rate(clk);
103 printf("clock %s get rate: %d\n", clk->name, new_rate);
104
105 //printf("disable clock %s\n", clk->name);
106 //hal_clock_disable(clk);
107 //clk_status = hal_clock_is_enabled(clk);
108 //printf("clock %s status:%s\n", clk->name, clk_status? "disabled" : "enabled");
109
110 //hal_clock_put(p_clk);
111 //hal_clock_put(clk);
112 }
113 }
114
115 printf("free size = 0x%x\n", esMEMS_FreeMemSize());
116 for (i = HAL_SUNXI_RESET; i < HAL_SUNXI_RESET_NUMBER; i++)
117 {
118 reset_type = i;
119 for (j = 0; j < reset_number[i]; j++)
120 {
121 reset_id = j;
122
123 printf("reset: get reset control, type:%d, id: %d\n", reset_type, reset_id);
124 reset = hal_reset_control_get(reset_type, reset_id);
125
126 printf("reset: control deassert\n");
127 hal_reset_control_deassert(reset);
128
129 reset_status = hal_reset_control_status(reset);
130 printf("reset status: %s", reset_status ? "assert" : "deassert");
131
132 printf("reset: put reset control, type:%d, id: %d\n", reset_type, reset_id);
133 hal_reset_control_put(reset);
134 }
135 }
136
137 printf("free size = 0x%x\n", esMEMS_FreeMemSize());
138 return 0;
139 }
140
141 MSH_CMD_EXPORT_ALIAS(cmd_test_ng_ccmu, hal_ccmu, sunxi - ng ccmu hal APIs tests)
142
143